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非空则会报错。
所以最好越是基础的库越是往编译语句右边放,会避免很多错误
有事下次继续...
浙公网安备 33010602011771号