linux – 使用Automake更正GCC命令行排序
发布时间:2020-12-13 19:15:15 所属栏目:Linux 来源:网络整理
导读:我有一个autotools项目,在Mac上编译得很好,但在 Linux(Ubuntu 12.04.1 LTS)下,传递给gcc的命令行相对于目标文件的库有乱序.例如,autotools生成以下命令来编译我的代码,将名为test.c的单个文件转换为名为test的二进制文件: gcc -I/usr/include/glib-2.0 -I/u
我有一个autotools项目,在Mac上编译得很好,但在
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将正确执行和链接.应该注意的是,Mac OS X Lion上的gcc似乎没有这个问题. 解决方法
结果证明LDFLAGS和LDADD之间存在差异.简而言之,在命令行上的目标文件和之后添加LDADD之前添加LDFLAGS.因此,将Makefile.am更改为以下内容解决了以下问题:
CFLAGS=-Wall bin_PROGRAMS=test test_CFLAGS=$(GLIB_CFLAGS) test_LDADD=$(GLIB_LIBS) test_SOURCES=test.c 它只是追踪一位正在解决的GCC开发人员.另外,我提供的这个例子相当差,因为测试在autotools的某些上下文中具有定义的含义. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |