Mac では問題なくコンパイルされる autotools プロジェクトがありますが、Linux (Ubuntu 12.04.1 LTS) では、コマンド ラインが渡されgcc
て、ライブラリがオブジェクト ファイルに対して順不同になります。たとえば、autotools は次のコマンドを生成してコードをコンパイルしtest.c
ますtest
。
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
このコマンド ラインは次のエラーで失敗します。
/home/user/glib-test/test.c:4: undefined reference to `g_malloc`
/home/user/glib-test/test.c:5: undefined reference to `g_free`
ただし、コマンドラインからコンパイルして切り替えて、ライブラリ参照がオブジェクトファイルの後にあるようにすると、問題なく動作します。
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
問題は、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
適切に実行およびリンクする方法を考えているだけです。gcc
Mac OS X Lion では、この問題はないようです。