GCC链接顺序改变了?
我试图使用GCC链接一个C ++模块,基本上是这样的:
gcc -c hello.c
g++ -c world.cpp
gcc -ohello -lstdc++ hello.o world.o
请注意,我使用-lstdc++
来链接C ++模块,以便我可以使用gcc
而不是g++
。 问题是我得到错误:
undefined reference to `operator new(unsigned long)'
(假设world.cpp
至少包含一个new
调用。)
这个错误是固定的,如果我把-lstdc++
放在链接器行的末尾,就像这样:
gcc -ohello hello.o world.o -lstdc++
我知道这个问题在这里已经有很多次了,但我有一个特殊的要求。 我不是直接调用GCC。 我正在使用不同的编程语言(Mercury)的构建系统,它以我的名义调用GCC,并且我无法轻松修改它调用GCC的方式(尽管我可以使用LDFLAGS环境变量指定其他库)。 所以我有两个额外的要求:
g++
来链接(只有gcc
) - 这就是为什么我在做上面的-lstdc++
技巧,而不是简单地用g++
连接)。 我明白订单的重要性的基本原因,但是让我困惑的是为什么现在这样突破? 我刚更新到Ubuntu 11.10 / GCC 4.6.1。 我已经使用上述技术成功地编译了这个程序多年(首先将-lstdc++
放入)。 现在只有这个错误出现了。 我使用-lgl
与OpenGL建立了一个无关联的程序,当升级时我的程序也崩溃了,我必须将-lgl
移动到命令行的末尾。 我可能会发现我的几十个程序不再编译。 为什么这个改变? 我的新系统有什么问题,或者是现在的方式? 请注意,这些是普通的共享库,不是静态链接的。
有什么我可以做的,使海湾合作委员会回到旧的方式,图书馆的顺序并不重要? 有什么其他的方式可以说服GCC正确链接libstdc++
,而不必在命令行上的.o
文件之后移动它?
如果水星在库之后放置目标文件,水星就会坏掉。 库之后属于对象文件 - 始终。 您有时可能会违背相反的顺序,但不可靠。 (静态库必须在引用静态库中的符号的目标文件之后,有时,即使没有使用任何符号,链接器也会记录由共享库定义的符号;有时,链接器仅会记录共享库符号如果共享库提供至少一个符号。)
链接地址: http://www.djcxy.com/p/85767.html