当我尝试使用g ++解决linker problem时,我发现由于未定义的符号,尝试在一个命令中编译链接简单的单文件程序失败了。
g++ -lEGL -lGLESv2 -o test test.cpp
但是,如果我单独编译test.cpp,然后作为第二步链接,一切正常。
g++ -c test.cpp
g++ -o test test.o -lGL -lGLESv2
第一个命令和其他命令之间有什么区别,为什么一种方式会失败而另一种方式会起作用?我猜它与链接的顺序有关,但我觉得这是一个小小的车。
答案 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
您告诉链接器搜索libEGL
和libGLESv2
未解析的符号
在读取目标文件deleteme.o
之前需要来自它们的符号,所以那些符号
将无法解决。在你的第二个链接中:
g++ -o test test.o -lGL -lGLESv2
您已获得正确的连结顺序。这里没有任何错误。来自man ld
链接器将仅在存档位置搜索一次存档 它在命令行中指定。如果存档定义了 在一些出现在之前的物体中未定义的符号 在命令行上存档,链接器将包含 存档中的相应文件。但是,一个未定义的符号 在稍后出现在命令行中的对象中不会导致 链接器再次搜索存档。