我的项目依赖于一个库(更准确地说,是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?
发布于 2012-04-18 23:35:23
使用PKG_CHECK_MODULES时,需要在Makefile.am中指定标志。最简单的方法是将其添加到AM_LDFLAGS和AM_CPPFLAGS中
AM_LDADD = @GTK_LIBS@
AM_CPPFLAGS = @GTK_CFLAGS@如果你想说得更具体一些,你可以添加:
secretary_LDADD = @GTK_LIBS@
secretary_CPPFLAGS = @GTK_CFLAGS@完全不使用PKG_CHECK_MODULES并让用户通过通常的机制(分配LDFLAGS或在标准位置安装库)指定库的位置可能更容易。
发布于 2012-04-19 10:19:16
从@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,从中我找到了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文件中找到了它们:
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和*_LDADD标志。我得到的(有效的)配置是:
bin_PROGRAMS = secretary
secretary_SOURCES = secretary.c
secretary_CFLAGS = @GTK_CFLAGS@
secretary_LDADD = @GTK_LIBS@https://stackoverflow.com/questions/10208523
复制相似问题