相关疑难解决方法(0)

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在命令行上的文件后移动它?

linker gcc

13
推荐指数
1
解决办法
5577
查看次数

标签 统计

gcc ×1

linker ×1