【问题标题】:strange g++ linking behavior depending on arguments order奇怪的 g++ 链接行为取决于参数顺序
【发布时间】:2013-09-16 12:21:57
【问题描述】:

我试图在 msys 上使用 g++ 编译一个简单的 opengl 程序。令我惊讶的是,链接器抱怨未定义的引用:

$ g++ -mwindows -lopengl32 glut_md2.cpp
C:\Users\...\cceQtYAy.o:glut_md2.cpp:(.text+0x67a): undefined reference to `glGenTextures@8'
C:\Users\...\cceQtYAy.o:glut_md2.cpp:(.text+0x696): undefined reference to `glBindTexture@8'
....

谷歌搜索了一段时间后,我发现问题出在 g++ 参数顺序上:

$ g++ glut_md2.cpp -mwindows -lopengl32
--- all ok! ---

有趣的是,g++ 中正确的参数顺序在第一个示例中。那就是:

$ g++ --help
Usage: g++.exe [options] file...
....

我错过了什么吗?为什么在文件参数之后移动选项会使编译成功?在linux上本地编译时我从来没有遇到过这个问题......

【问题讨论】:

    标签: reference g++ undefined msys


    【解决方案1】:

    我遇到过一两次这个问题,你应该把 -L 和 -l 放在命令行的末尾。 g++ 不链接,它调用 ld 并传递参数,ld man:

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

    ld -o /lib/crt0.o hello.o -lc

    【讨论】:

    • 奇怪。我认为 g++ 应该将链接选项传递给链接器,因为它在上面的示例中非常明确。巫毒魔法……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2015-03-02
    相关资源
    最近更新 更多