为什么将参数传递给g ++的顺序很重要

Rav*_*shi 4 c++ g++

最近,我试图构建一个应用程序,它使用一些库,以共享对象文件的形式提供.我在编写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库所引用的未定义符号.

  • @RaviJoshi是的。始终将库* last *放在命令行上。:) (3认同)