3

私のプロジェクトはライブラリ (より正確には GTK+) に依存しているため、次の構成を my.xml に追加しました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.amAM_LDFLAGS最も簡単な方法は、 andに追加すること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ではなくフラグ*_CFLAGS*_LDADDフラグを設定する必要があると結論付けました。私の結果の(作業中の)構成は次のとおりです。

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