g++/gcc编译过程中遇到的问题

第一次写博客,用来记录一下编程过程中遇到的问题。
在学习leveldb的过程中遇到了一个编译问题,以前虽然碰到过,也解决了,但是没有总结和记录,导致再次出现,差点忘记怎么弄的了,所以以此记录一下。

一问题描述:

在编译源文件(编译语句: g++ -std=gnu++0x -I./ -L./ -lleveldb -lpthread test.cpp -o test)的时候发现如下错误:

test.cpp:(.text+0x24): undefined reference to `leveldb::Options::Options()'
test.cpp:(.text+0x88): undefined reference to `leveldb::DB::Open(leveldb::Options const&, std::string const&, leveldb::DB**)'

当然出现这个错误后,回忆了一下,以前碰到过,被我给试验出来了,哈哈哈,当即就调整编译语句为:g++ test.cpp -std=gnu++0x -I./ -L./ -lleveldb -lpthread -o test,编译就成功了。
其实一看就知道问题出在test.cpp编译顺序上,第一次编译时将其放在后面,第二次放在前面。

二问题分析:

原因是gcc/g++编译时,源文件不能放在关联库后面,编译器从左往右扫描,需要两个表T1,T2
T1:记录了所有未决的符号
T2: 记录了所有需要链接的库
1 如果是一个obj文件则将未决的符号放入表T1中;
2 如果是一个库文件就查找是否有T1表中的符号,如果有则去掉T1中的符号,因为已经被当前库解决了,同时将库放入T2中
扫描结束后如果T1非空则会报错。

所以最好越是基础的库越是往编译语句右边放,会避免很多错误

有事下次继续...

posted @ 2019-03-05 17:14  啊嘿呦  阅读(473)  评论(0)    收藏  举报