从@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 有同样的问题并解决了它 - 但没有发布全面的解释......所以我去看了他的项目。我查看了它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
and*_LDADD
标志。我得到的(工作)配置是:
bin_PROGRAMS = secretary
secretary_SOURCES = secretary.c
secretary_CFLAGS = @GTK_CFLAGS@
secretary_LDADD = @GTK_LIBS@