最近,我试图构建一个应用程序,它使用一些库,以共享对象文件的形式提供.我在编写CPP代码时浪费了很多时间,但它没有用.
下面是命令,以前我试图编译代码 -
g++ -I/opt/ros/indigo/include/ -I/usr/include/eigen3/ -L/opt/ros/indigo/lib/ -lorocos-kdl -lkdl_parser test.cpp -o test
Run Code Online (Sandbox Code Playgroud)
以上命令始终显示许多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
Run Code Online (Sandbox Code Playgroud)
我在这里发布了完整的代码和解决方案.
我的问题是为什么将参数传递给g ++的顺序很重要?有没有其他方法可以避免将来出现这类问题?
Som*_*ude 10
一般来说,参数的顺序并不重要,但当然有例外.例如,如果您提供多个-O标志,它将是最后一个使用的标志,对于其他标志也是如此.
但是,图书馆有点不同,因为对他们而言,订单很重要.如果对象文件或库A依赖于库B,则A必须先B在命令行上进行.这是因为链接器扫描符号的方式:当您使用库时,链接器将检查是否存在可以解析的符号.扫描结束后,库将被丢弃,不会再次搜索.
这意味着当-lorocos-kdl -lkdl_parser test.cpp链接器将扫描库时orocos-kdl,kdl_parser首先注意这些库没有依赖关系,不需要库中的符号,并继续使用源文件生成的目标文件.
当您将订单更改为test.cpp -lorocos-kdl -lkdl_parser链接器时,将能够解析test.cpp库所引用的未定义符号.
| 归档时间: |
|
| 查看次数: |
623 次 |
| 最近记录: |