现在的位置: 首页 > 综合 > 正文

gcc 链接顺序

2013年03月18日 ⁄ 综合 ⁄ 共 697字 ⁄ 字号 评论关闭

        最近要使用sqlite3,简单封装了下接口并做了测试,很简单的通过。然后将代码拷贝到工程中,修改makefile(-lsqlite3)。随后问题来了....
原来使用的Makefile是这样写的:

CFLAGS=$(CFLAG)
CFLAGS+=-DTEST_MODE -pthread -g -Wall -lsqlite3
CC = gcc

objs +=...			
so_objs +=...
		
all : voice
voice: $(objs)
	$(CC) ${CFLAGS} -o test  $(objs)

make 一下? 所有sqlite3库中提供的接口均 undefined...!
凭直觉就是没找到libsqlite3,继续指定库路径.....没用!就这样两个小时过去了。

晚上回家搜了半天,提供的都是 -sqlite3的解决方法,显然不是这样子。偶然间发现一篇关于ld 链接顺序问题的文章,于是恍然大悟。修改Makefile如下:

CFLAGS=$(CFLAG)
CFLAGS+=-DTEST_MODE -g -Wall -pthread -lsqlite3
CC = gcc

objs += ...
so_objs += ...		

all : voice
voice: $(objs)
	$(CC)  -o test  $(objs) ${CFLAGS}

把CFLAGS放到最后,问题解决。
gcc 手册里有这么一段:

神翻译:链接器按照它们指定的顺序搜索和处理库和目标文件。因此, foo.o -lz bar.o 在处理foo.o之后且在处理bar.o之前搜索库 z。如果bar.o引用了库 z内部的函数,则这些函数可能没有被加载.......于是就会出现 ***reference undefined的愚蠢错误!

抱歉!评论已关闭.