g++链接顺序

275 阅读2分钟

在GCC(GNU Compiler Collection)的g++命令中,链接库的顺序是很重要的。当链接器(ld)尝试解析符号时,它会从左到右处理命令行上的参数。如果库(在这种情况下是 -lACE)被指定在它所需要解析的符号之前,那么链接器可能不会包括库中的符号。

这是因为在遍历库的时候,链接器仅查找那些至此为止未解析的符号。如果在命令行中先指定了 -lACE,然后是源代码文件,链接器在处理 -lACE 参数时还没有遇到任何未解析的符号,因此它不会将ACE库中的任何对象文件链接到输出中。当它到达源代码文件并找到对ACE库中函数的引用时,这些引用就无法解析,因为ACE库没有被包含在内。

在你的案例中,第一个命令:

g++ -std=c++11 main.cpp -o test1 -lACE

这里,源代码文件(main.cpp)首先被编译,生成了未解析的符号。然后 -lACE 选项告诉链接器在已经编译的对象中寻找这些未解析的符号,这时可以在ACE库中找到并正确链接。

但在第二个命令:

g++ -std=c++11 -lACE main.cpp -o test1

-lACE 在源代码之前给出,这时链接器还没有遇到任何未解析的符号,因此它不会链接ACE库。之后,当编译器编译main.cpp并生成新的未解析的符号时,链接器无法将这些符号解析为之前未包含的ACE库,从而导致链接错误。

正确的做法是先指定你的源代码文件,然后指定库,这样链接器可以解析所有在编译过程中生成的未解析符号。