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_SYstemAM_INIT_AUTomake()AC_PROG_CCAM_PROG_CC_C_OPKG_CHECK_MODulES(GliB,glib-2.0 > 2.0)AC_CONfig_fileS(Makefile)AC_OUTPUT
接下来是简单的Makefile.am:
CFLAGS=-Wallbin_PROGRAMS=testtest_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 ChangeLogaclocalautoconfautomake --add-missing./configuremake
我应该清楚,我理解为什么我的代码不会编译,我只是想知道如何让automake将库放在命令行的末尾,这样gcc将正确执行和链接.应该注意的是,Mac OS X lion上的gcc似乎没有这个问题.
解决方法 结果证明LDFLAGS和LDADD之间存在差异.简而言之,在命令行上的目标文件和之后添加LDADD之前添加LDFLAGS.因此,将Makefile.am更改为以下内容解决了以下问题:CFLAGS=-Wallbin_PROGRAMS=testtest_CFLAGS=$(GliB_CFLAGS)test_LDADD=$(GliB_liBS)test_SOURCES=test.c
它只是追踪一位正在解决的GCC开发人员.另外,我提供的这个例子相当差,因为测试在autotools的某些上下文中具有定义的含义.
总结以上是内存溢出为你收集整理的linux – 使用Automake更正GCC命令行排序全部内容,希望文章能够帮你解决linux – 使用Automake更正GCC命令行排序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)