12

我有一个在 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 上似乎没有这个问题。

4

2 回答 2

16

解决方案原来是 和 之间的LDFLAGS差异LDADD。简而言之LDFLAGS,在命令行上的目标文件之前LDADD添加,然后添加。因此,更改Makefile.am为以下解决了该问题:

CFLAGS=-Wall
bin_PROGRAMS=test
test_CFLAGS=$(GLIB_CFLAGS)
test_LDADD=$(GLIB_LIBS)
test_SOURCES=test.c

只需要找到工作中的 GCC 开发人员即可解决。此外,我提供的这个示例相当糟糕,因为test在某些自动工具的上下文中具有定义的含义。

于 2012-11-28T20:05:25.240 回答
1

我解决了一个类似的问题。由于缺少符号,有问题的 ./configure 脚本无法完成对函数是否存在的检查。如果我添加了正确的库$LDFLAGS或类似的,它是在.c文件之前添加的,并且该库被忽略。

首先添加要检查的函数的名称,ac_func_list然后在./configure每个函数的主体中都有一个循环,然后依次ac_fn_c_check_func ()调用ac_fn_c_try_link ()

检查函数 ac_fn_c_try_link () 使用这种模式的命令:

ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS \
         $LDFLAGS conftest.$ac_ext $LIBS >&5'

$LDADD这里完全忽略。因此,这里唯一的解决方案是将-l标志添加到 variable $LIBS

于 2013-11-25T14:59:05.507 回答