单命令编译和链接失败,单独的步骤工作

时间:2015-02-22 06:50:28

标签: linker g++

当我尝试使用g ++解决linker problem时,我发现由于未定义的符号,尝试在一个命令中编译链接简单的单文件程序失败了。

g++ -lEGL -lGLESv2 -o test test.cpp

但是,如果我单独编译test.cpp,然后作为第二步链接,一切正常。

g++ -c test.cpp
g++ -o test test.o -lGL -lGLESv2

第一个命令和其他命令之间有什么区别,为什么一种方式会失败而另一种方式会起作用?我猜它与链接的顺序有关,但我觉得这是一个小小的车。

1 个答案:

答案 0 :(得分:1)

按照以下方式编译和链接时,按照:

g++ -lEGL -lGLESv2 -o test test.cpp

g++服从,就像你做的那样:

g++ -c -o deleteme.o test.cpp
g++ -lEGL -lGLESv2 -o test deleteme.o
rm deleteme.o

(如果使用-v(详细)选项运行命令并仔细检查 goobledegook仔细,你将能够发现不同的调用 编译器,汇编器和链接器,以及之间传递的临时文件)。

所以你现在看到了什么问题?这是图书馆搜索顺序。在联系中:

g++ -lEGL -lGLESv2 -o test deleteme.o

您告诉链接器搜索libEGLlibGLESv2未解析的符号 在读取目标文件deleteme.o之前需要来自它们的符号,所以那些符号 将无法解决。在你的第二个链接中:

g++ -o test test.o -lGL -lGLESv2

您已获得正确的连结顺序。这里没有任何错误。来自man ld

  

链接器将仅在存档位置搜索一次存档   它在命令行中指定。如果存档定义了   在一些出现在之前的物体中未定义的符号   在命令行上存档,链接器将包含   存档中的相应文件。但是,一个未定义的符号   在稍后出现在命令行中的对象中不会导致   链接器再次搜索存档。