【问题标题】:Single-command compile and link fails, separate steps work单命令编译和链接失败,单独的步骤工作
【发布时间】:2015-02-22 06:50:28
【问题描述】:

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

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

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

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

第一个命令和其他命令有什么区别,为什么一种方法会失败而另一种方法会起作用?我猜这与链接顺序有关,但我觉得这有点错误。

【问题讨论】:

    标签: linker g++


    【解决方案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

    链接器只会在存档位置搜索一次 它是在命令行中指定的。如果档案定义了一个 在出现在之前的某个对象中未定义的符号 在命令行存档,链接器将包括 档案中的适当文件。但是,未定义的符号 在稍后出现在命令行上的对象中不会导致 链接器再次搜索存档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多