3

我的项目依赖于一个库(更准确地说,是 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?

4

2 回答 2

2

使用时PKG_CHECK_MODULES,需要在Makefile.am. 最简单的方法是将其添加到AM_LDFLAGSand AM_CPPFLAGS

AM_LDADD = @GTK_LIBS@
AM_CPPFLAGS = @GTK_CFLAGS@

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

secretary_LDADD = @GTK_LIBS@
secretary_CPPFLAGS = @GTK_CFLAGS@

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

于 2012-04-18T15:35:23.453 回答
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  

其中库在目标代码之前传递给编译器。.oGCC 不接受它并给了我这个错误:

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而是设置*_CFLAGSand*_LDADD标志。我得到的(工作)配置是:

bin_PROGRAMS = secretary
secretary_SOURCES = secretary.c
secretary_CFLAGS = @GTK_CFLAGS@
secretary_LDADD = @GTK_LIBS@
于 2012-04-19T02:19:15.647 回答