【问题标题】:GCC static linking orderGCC静态链接顺序
【发布时间】:2016-04-11 23:07:48
【问题描述】:

我注意到我无法在命令末尾使用 cpp 文件编译我的代码:

ars@Arsmint$ g++ -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor main.cpp 
/tmp/ccxlyIri.o: In function `main':
main.cpp:(.text+0x10c): undefined reference to `createDevice'
collect2: error: ld returned 1 exit status

如果我把它们放在链接指令之前,它编译得很好:

ars@Arsmint$ g++ main.cpp -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor
ars@Arsmint$

我已经阅读了一些解释 herethere,但是当涉及到编译源时,我仍然不太明白,而不是库依赖。我原以为编译器总是先编译代码,然后才调用链接器。在这种情况下,它应该知道从 main.cpp 构建的目标文件甚至在链接过程开始之前就需要 createDevice 函数。我的错在哪里?

附: This问题,作为重复提出,根本不解释。

【问题讨论】:

    标签: gcc linker static-linking


    【解决方案1】:

    您可能会因为走捷径而感到困惑(似乎很多人都是这样) 在一个命令中编译和链接。

    g++ -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor main.cpp
    

    在功能上等同于:

    # g++ invokes the C++ compiler (cc1plus). The linkage options are ignored.
    g++ -c -o deleteme.o main.cpp
    
    # g++ invokes the system linker (ld). The linkage options are passed.
    g++ -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor -o a.out deleteme.o
    rm deleteme.o
    

    如果你明确地执行了这两个步骤,你会这样做,例如

    # Compile step
    g++ -c -o main.o main.cpp
    # Link step.
    g++ -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor -o prog main.o
    

    在链接步骤中,g++暗中为宿主添加了默认的C++链接选项 系统到命令行,然后将其交给链接器。 C++ 编译器是 不参与。

    默认情况下,当遇到库时,链接器最多检查一次 在命令行链接序列中,它只会检查库以查看 如果库可以解析前面提到的任何迄今未解析的符号 连锁顺序。在链接序列的末尾,如果所有引用的符号都 解决,则链接成功,否则失败。

    联动:

    g++ -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor -o a.out deleteme.o
    

    将失败,因为所有库都出现在任何目标文件之前。当每个图书馆 到达时,链接器尚未发现未解析的符号,因此忽略该库。 当链接器最终到达尾随目标文件并发现一些未解决的 符号,它们仍然未解析。

    反之,

    g++ main.cpp -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor
    

    相当于:

    g++ -c -o deleteme.o main.cpp    
    g++ -o a.out deleteme.o -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor
    rm deleteme.o
    

    链接顺序正确,符号需要定义 在提供它们的库之前被发现。

    【讨论】:

      猜你喜欢
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多