使用PKG_CHECK_MODULES时,autoconf生成的Makefile不会传递库头的标志

问题描述 投票:3回答:2

我的项目取决于一个库(更确切地说是GTK +),所以我在configure.ac中添加了以下配置:

PKG_CHECK_MODULES([GTK], [gtk+-2.0])
AC_SUBST([GTK_CFLAGS])
AC_SUBST([GTK_LIBS])

我的Makefile.am是:

bin_PROGRAMS = secretary
secretary_SOURCES = secretary.c

依次,我的secretary.c如下:

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_widget_show(window);
    gtk_main();
    return 0;
}

但是,当我运行make时(当然,在调用./configure之后,却出现此错误:

gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT secretary.o -MD -MP -MF .deps/secretary.Tpo -c -o secretary.o secretary.c
secretary.c:1:21: fatal error: gtk/gtk.h: File or directory not found.

我想念的是什么?为什么autoconf无法将正确的标志传递给gcc?

autotools autoconf automake pkg-config
2个回答
2
投票

使用PKG_CHECK_MODULES时,需要在Makefile.am中指定标志。最简单的方法是将其添加到AM_LDFLAGSAM_CPPFLAGS

AM_LDADD = @GTK_LIBS@
AM_CPPFLAGS = @GTK_CFLAGS@

如果您想更具体,则可以添加:

secretary_LDADD = @GTK_LIBS@
secretary_CPPFLAGS = @GTK_CFLAGS@

完全不使用PKG_CHECK_MODULES,让用户通过通常的机制(指定LDFLAGS或在标准位置安装库)来指定库的位置可能更容易。


2
投票

[从@William Pursell的建议开始,我正在寻找解决方案。这个答案有些冗长,因为我觉得有必要说明为什么我不接受这个有用的帖子作为答案。

注意如果您正在寻找魔术线,只需跳到最后的“解决方案”部分。

尝试建议的解决方案

我尝试了William Pursell解决方案,但发现了一个问题:GCC 4.6.1在处理某些参数的排序时特别要求严格。因此,当我如下设置变量时:

secretary_CPPFLAGS = @GTK_CFLAGS@ # DOES NOT WORK!
secretary_LDFLAGS = @GTK_LIBS@    # DOES NOT WORK!

我得到了以下gcc调用行:

gcc -std=gnu99  -g -O2 -pthread -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 \
    -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 \
    -lfreetype lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt \
    -lglib-2.0    -o secretary secretary-secretary.o  

将库传递到编译器的位置之前 .o目标代码。 GCC不接受它,但给了我这个错误:

secretary-secretary.o: In function `main':
/home/adam/software/secretary-gtk/secretary.c:4: undefined reference to `gtk_init'
/home/adam/software/secretary-gtk/secretary.c:5: undefined reference to `gtk_window_new'
/home/adam/software/secretary-gtk/secretary.c:6: undefined reference to `gtk_widget_show'
/home/adam/software/secretary-gtk/secretary.c:7: undefined reference to `gtk_main'

正在研究中

[寻找解决方案,我发现@ uidzer0具有the same problem并已解决-但未发布全面的说明...因此,我去寻找his project。我查看了它的configure.ac,在其中找到了configure.ac的用法:

PKG_CHECK_MODULES

所以我寻找在哪里使用了生成的变量(PKG_CHECK_MODULES([FUSE], [fuse >= 2.8.3]) PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.22.5]) PKG_CHECK_MODULES([GTHREAD], [gthread-2.0]) PKG_CHECK_MODULES([CURL], [libcurl >= 7.16.0]) 等)。我在FUSE_LIBS文件中找到了它们:

src/Makefile.am

解决方案

所以我得出结论,我不应该设置src/Makefile.am / stormfs_CFLAGS = -D_REENTRANT \ -DFUSE_USE_VERSION=26 \ -D_FILE_OFFSET_BITS=64 \ -DSYSCONFDIR=\"${sysconfdir}\" \ ${FUSE_CFLAGS} \ ${CURL_CFLAGS} \ ${GLIB_CFLAGS} \ ${GTHREAD_CFLAGS} stormfs_LDADD = ${LIBS} \ ${FUSE_LIBS} \ ${CURL_LIBS} \ ${GLIB_LIBS} \ ${GTHREAD_LIBS} ,而应该设置*_CPPFLAGS*_LDFLAGS标志。然后,我得到的(有效的)配置是:

*_CFLAGS
© www.soinside.com 2019 - 2024. All rights reserved.