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++连接)。
  • 我不认为我可以控制链接器命令的顺序 - Mercury会将任何库之后的.o文件放在命令行中。
  • 我明白订单的重要性的基本原因,但是让我困惑的是为什么现在这样突破? 我刚更新到Ubuntu 11.10 / GCC 4.6.1。 我已经使用上述技术成功地编译了这个程序多年(首先将-lstdc++放入)。 现在只有这个错误出现了。 我使用-lgl与OpenGL建立了一个无关联的程序,当升级时我的程序也崩溃了,我必须将-lgl移动到命令行的末尾。 我可能会发现我的几十个程序不再编译。 为什么这个改变? 我的新系统有什么问题,或者是现在的方式? 请注意,这些是普通的共享库,不是静态链接的。

    有什么我可以做的,使海湾合作委员会回到旧的方式,图书馆的顺序并不重要? 有什么其他的方式可以说服GCC正确链接libstdc++ ,而不必在命令行上的.o文件之后移动它?


    如果水星在库之后放置目标文件,水星就会坏掉。 库之后属于对象文件 - 始终。 您有时可能会违背相反的顺序,但不可靠。 (静态库必须在引用静态库中的符号的目标文件之后,有时,即使没有使用任何符号,链接器也会记录由共享库定义的符号;有时,链接器仅会记录共享库符号如果共享库提供至少一个符号。)

    链接地址: http://www.djcxy.com/p/85767.html

    上一篇: GCC link order changed?

    下一篇: Telling gcc directly to link a library statically