@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
と*_LDADD
フラグを設定する必要があると結論付けました。私の結果の(作業中の)構成は次のとおりです。
bin_PROGRAMS = secretary
secretary_SOURCES = secretary.c
secretary_CFLAGS = @GTK_CFLAGS@
secretary_LDADD = @GTK_LIBS@