我试图使用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++).我理解的根本原因的顺序很重要,但什么是莫名其妙我是为什么会出现这种突破呢?我刚刚更新到Ubuntu 11.10/GCC 4.6.1.我已经成功地使用上述技术(-lstdc++首先放置)编译了这个程序多年.只是现在才出现这个错误.一个不相关的我的程序与OpenGL的使用链接-lgl,当我升级时我也不得不移动-lgl到命令行的末尾.我可能会发现我的几十个程序不再编译.为什么这会改变?我的新系统有问题还是现在的样子?请注意,这些是普通的共享库,而不是静态链接.
有什么办法可以让GCC回到原来的方式,图书馆的顺序无关紧要吗?有没有其他方法可以说服GCC libstdc++正确链接而不.o在命令行上的文件后移动它?
Jon*_*ler 13
如果Mercury将目标文件放在库之后,Mercury就会被破坏.库属于目标文件 - 总是如此.您有时可能会违反相反的顺序,但不可靠.(静态库必须跟在静态库中引用符号的目标文件之后.有时,链接器会记录共享库定义的符号,即使没有使用任何符号;有时,链接器只会记录共享库符号如果共享库提供至少一个符号.)
| 归档时间: |
|
| 查看次数: |
5577 次 |
| 最近记录: |