【GCC】参数顺序导致的“undefined reference”问题
2010-11-23 13:36
831 查看
上学的时候接触了gcc和makefile,但直到真正实习的时候开始使用,才发现自己学的真是搓啊……
言归正传,今天遇到一个问题,编译遇到一大串的“undefined reference”,命令如下:
后来经过摸索,发现如下命令可以编译成功:
但不明白其所以然。百度后发现原因(参见:http://hi.baidu.com/thinkingdeeply/blog/item/990035d18ecad0d0562c8468.html):
对于C/C++编译而言,读取编译选项是按照从左到右的顺序执行的(注1) 。那么当编译器遇到源文件的时候,就开始对源文件中用到的函数进行解析,找到相对应的函数的函数体或者说是实现(Definition of Function)。这个过程是按照先遇到不能解析的函数(unresolved function),然后在源文件选项后面的一些选项中寻找可能的函数体的信息,是这样的一个顺序进行的。那么我们可以发现对于Makefile A,由于包含函数体或者函数定义信息的编译选项出现在源文件之前,那么当编译器在源文件中遇到不能解析的函数时,在源文件之后的选项中寻找相关的信息,那么就出现了编译错误,也就是无法找到相关的函数定义。
因此上述两句命令的关键不同在于“triple_unittest.o”的位置是否在“-lgtest”之前,其它神马都是浮云。
PS:感冒真是难受啊!带病工作中ZZ~
言归正传,今天遇到一个问题,编译遇到一大串的“undefined reference”,命令如下:
g++ -I/home/work/btestroot/com/btest/gtest/output/include -L/home/work/btestroot/com/btest/gtest/output/lib -L. -ltriple -lgtest_main triple_unittest.o -o triple_unittest
后来经过摸索,发现如下命令可以编译成功:
g++ -o triple_unittest triple_unittest.o -I/home/work/btestroot/com/btest/gtest/output/include -L/home/work/btestroot/com/btest/gtest/output/lib -lgtest -lgtest_main -L. -ltriple
但不明白其所以然。百度后发现原因(参见:http://hi.baidu.com/thinkingdeeply/blog/item/990035d18ecad0d0562c8468.html):
对于C/C++编译而言,读取编译选项是按照从左到右的顺序执行的(注1) 。那么当编译器遇到源文件的时候,就开始对源文件中用到的函数进行解析,找到相对应的函数的函数体或者说是实现(Definition of Function)。这个过程是按照先遇到不能解析的函数(unresolved function),然后在源文件选项后面的一些选项中寻找可能的函数体的信息,是这样的一个顺序进行的。那么我们可以发现对于Makefile A,由于包含函数体或者函数定义信息的编译选项出现在源文件之前,那么当编译器在源文件中遇到不能解析的函数时,在源文件之后的选项中寻找相关的信息,那么就出现了编译错误,也就是无法找到相关的函数定义。
因此上述两句命令的关键不同在于“triple_unittest.o”的位置是否在“-lgtest”之前,其它神马都是浮云。
PS:感冒真是难受啊!带病工作中ZZ~
相关文章推荐
- 编译参数顺序导致奇怪问题
- gcc编译出现undefined reference to 的问题
- 用gcc编译.cpp文件可能出现"undefined reference to `__gxx_personality_v0'"问题的解决
- 库依赖错误导致main.c:(.text+0x7): undefined reference问题
- 用gcc编译.cpp文件可能出现"undefined reference to `__gxx_personality_v0'"问题的解决
- ubuntu下 GCC编译程序出现 undefined reference to `std::ios_base::Init::Init()'问题
- gcc编译出现 undefined reference to 的问题
- 由于link顺序错误导致的undefined reference
- ubuntu下 GCC编译程序出现 undefined reference to `std::ios_base::Init::Init()'问题
- ubuntu下 GCC编译程序出现 undefined reference to `std::ios_base::Init::Init()'问题
- Linux下undefined reference to ‘pthread_create’问题解决接触了Linux系统编程中的线程编程模块,可gcc sample.c(习惯把书上的sample代码写
- gcc链接顺序新手坑-undefined reference to `XXX'
- ubuntu下 GCC编译程序出现 undefined reference to `std::ios_base::Init::Init()'问题——gcc编译C++代码
- gcc编译参数的顺序问题——关于static和动态链接库
- 类中静态变量未定义导致undefined reference to static class member问题的解决方法
- ubuntu下 GCC编译程序出现 undefined reference to `std::ios_base::Init::Init()'问题
- 链接错误'undefined reference to'与gcc参数 -l -L -I
- GCC版本不兼容导致的链接错误:undefined reference to `SomeFunction'
- gcc/mpicc 编译器 undefined reference to ... 问题的解决
- 又是undefined reference to xxx ------库顺序问题