最近,我试图构建一个应用程序,它使用一些以共享对象文件形式提供的库。我在编译 CPP 代码时浪费了很多时间,但没有成功。
下面是命令,之前我试图编译代码-
g++ -I/opt/ros/indigo/include/ -I/usr/include/eigen3/ -L/opt/ros/indigo/lib/ -lorocos-kdl -lkdl_parser test.cpp -o test
上面的命令总是显示很多undefined references
错误。出于好奇,我更改了参数的顺序。下面是正在运行的命令-
g++ -L/opt/ros/indigo/lib -I/opt/ros/indigo/include -I/usr/include/eigen3 test.cpp -lorocos-kdl -lkdl_parser -o test
我贴出了完整的代码和解决方案here .
我的问题是为什么将参数传递给 g++ 的顺序很重要?有没有其他方法可以避免将来出现此类问题?
最佳答案
通常参数的顺序无关紧要,但当然也有异常(exception)。例如,如果您提供多个 -O
标志,它将是最后一个使用的标志,其他标志也是如此。
不过图书馆有点不同,因为对他们来说顺序很重要。如果目标文件或库 A
依赖于库 B
,则在命令行中 A
必须位于 B
之前。这是因为链接器扫描符号的方式:当您使用库时,链接器将检查是否有任何可以解析的符号。扫描结束后,库将被丢弃,不会被再次搜索。
这意味着当您有 -lorocos-kdl -lkdl_parser test.cpp
时,链接器将首先扫描库 orocos-kdl
和 kdl_parser
,请注意这些库没有依赖项,不需要库中的符号,然后继续使用源文件生成的目标文件。
当您将顺序更改为 test.cpp -lorocos-kdl -lkdl_parser
时,链接器将能够解析 test.cpp
引用的 undefined symbol 到图书馆。
关于c++ - 为什么将参数传递给 g++ 的顺序很重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40603575/