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

标签 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

上面的命令总是显示很多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-kdlkdl_parser ,请注意这些库没有依赖项,不需要库中的符号,然后继续使用源文件生成的目标文件。

当您将顺序更改为 test.cpp -lorocos-kdl -lkdl_parser 时,链接器将能够解析 test.cpp 引用的 undefined symbol 到图书馆。

关于c++ - 为什么将参数传递给 g++ 的顺序很重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40603575/

相关文章:

c++ - 如何在 iPhone 上使用 LAME 编码为 .mp3 时显示进度条?

java - Swig C++ 到 Java UnsatisfiedLinkError

c++ - 只允许在 C++ 中定义的行为?

c++ - 以下是有效的 C++ 代码吗?

c++ - Cap'n Proto - 如何编译生成的 C++ 文件

c++ - 无法将 GLFW 库与其在 Ubuntu 18.04 上的头文件链接起来

c++ - Win32 应用程序 LNK2001 : unresolved external symbol _main

c++ - GUI 应用程序不允许访问 OSX 共享内存

c++ - 为作者-读者寻找最好的 boost 文件锁定机制

c++ - 初始化列表中的空大括号魔术