GCC链接顺序发生了变化?

mgi*_*uca 13 linker gcc

我试图使用GCC链接C++模块,基本上是这样的:

gcc -c hello.c
g++ -c world.cpp
gcc -ohello -lstdc++ hello.o world.o
Run Code Online (Sandbox Code Playgroud)

请注意,我-lstdc++用来链接C++模块,以便我可以使用gcc而不是g++.问题是我收到了错误:

undefined reference to `operator new(unsigned long)'
Run Code Online (Sandbox Code Playgroud)

(假设world.cpp至少包含一次调用new.)

如果我放在-lstdc++链接器行的末尾,则会修复此错误,如下所示:

gcc -ohello hello.o world.o -lstdc++
Run Code Online (Sandbox Code Playgroud)

我知道这个问题在这里被多次询问过,但我有一个特殊的要求.我不直接打电话给海湾合作委员会.我正在为不同的编程语言(Mercury)使用构建系统,它代表我调用GCC,我不能轻易修改它调用GCC的方式(尽管我可以使用LDFLAGS环境变量指定其他库).所以我有两个额外的要求:

  • 我不能使用g++链接(仅gcc) - 这就是为什么我在做-lstdc++上面的技巧而不是简单地链接g++).
  • 我不认为我可以控制链接器命令的顺序 - Mercury会任何库之后将.o文件放在命令行上.

我理解的根本原因的顺序很重要,但什么是莫名其妙我是为什么会出现这种突破呢?我刚刚更新到Ubuntu 11.10/GCC 4.6.1.我已经成功地使用上述技术(-lstdc++首先放置)编译了这个程序多年.只是现在才出现这个错误.一个不相关的我的程序与OpenGL的使用链接-lgl,当我升级时我也不得不移动-lgl到命令行的末尾.我可能会发现我的几十个程序不再编译.为什么这会改变?我的新系统有问题还是现在的样子?请注意,这些是普通的共享库,而不是静态链接.

有什么办法可以让GCC回到原来的方式,图书馆的顺序无关紧要吗?有没有其他方法可以说服GCC libstdc++正确链接而不.o在命令行上的文件后移动它?

Jon*_*ler 13

如果Mercury将目标文件放在库之后,Mercury就会被破坏.库属于目标文件 - 总是如此.您有时可能会违反相反的顺序,但不可靠.(静态库必须跟在静态库中引用符号的目标文件之后.有时,链接器会记录共享库定义的符号,即使没有使用任何符号;有时,链接器只会记录共享库符号如果共享库提供至少一个符号.)

  • 所以基本上这个"回归"只是对我整个开发事业而言,我一直依赖于它"意外地工作"并且现在已经停止工作的事实了?看起来像一个非常重大的变化 - 我已经把文件放在目标文件之前十年的大部分时间了,因为我不知道这是一个问题:(感谢您的建议.看起来问题不是水星放置库之后的对象,但是我的LDFLAGS命令中有更复杂的依赖项.我正在取得进展,所以我会给你一个勾号.谢谢. (3认同)