私はMac上でうまくコンパイルされるautotoolsプロジェクトを持っていますが、Linux(Ubuntu 12.04.1 LTS)ではコマンドラインにgcc
が渡され、ファイル。私はからコンパイルする場合は、しかし、Automakeを使用してGCCコマンドラインの順序を修正する
/home/user/glib-test/test.c:4: undefined reference to `g_malloc`
/home/user/glib-test/test.c:5: undefined reference to `g_free`
:たとえば、autotoolsのは、私のコードをコンパイルするには、次のコマンドを生成し、test
という名前のバイナリにtest.c
という名前の単一のファイル:
gcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -g -O2 -lglib-2.0 -o test test-test.o
は、このコマンドラインはで失敗しますコマンドラインを開き、ライブラリ参照がオブジェクトファイルの後にあるようにしてください。
gcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -g -O2 -o test test-test.o -lglib-2.0
チャレンジi Autotoolsに正しい順序でコマンドラインを生成させる方法を理解することはできません。わかりやすくするために、ここでは簡単なテストケースを再現しました。最初にconfigure.ac
である:
dnl Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(glib-test, 1.0)
AC_CANONICAL_SYSTEM
AM_INIT_AUTOMAKE()
AC_PROG_CC
AM_PROG_CC_C_O
PKG_CHECK_MODULES(GLIB, glib-2.0 > 2.0)
AC_CONFIG_FILES(Makefile)
AC_OUTPUT
次に簡単Makefile.am
ある:
CFLAGS=-Wall
bin_PROGRAMS=test
test_CFLAGS=$(GLIB_CFLAGS)
test_LDFLAGS=$(GLIB_LIBS)
test_SOURCES=test.c
最後に、ソースコードのこの最小のテストケース、test.c
に:
#include <glib.h>
int main(int argc, char **argv) {
gchar *foo = g_malloc(100);
g_free(foo);
return 0;
}
コンパイルがその後使用して達成されます次の一連のコマンド:
touch NEWS README AUTHORS ChangeLog
aclocal
autoconf
automake --add-missing
./configure
make
私はコードがコンパイルされない理由を理解していますが、automake
にコマンドラインの最後にライブラリを置く方法が不思議です。gcc
が正しく実行されてリンクされます。 Mac OS X Lionのgcc
にこの問題はないようです。
"Mac OS X Lionのgccではこの問題はないようです。"これは、アップル社がGCC 4.2のフォークを使用しているのに対し、この動作は新しいバージョンのGCC(GCC 4.5のIIRC)で導入されたためです。 –