链接时批量std :: functions的多个定义

时间:2010-02-05 16:57:01

标签: c++ c linker linker-errors multiple-definition-error

我正在尝试将一些外部代码集成到我的应用程序中。我的代码是纯C,但是新代码是C ++,所以我只是将我的C文件重命名为.cc并用g ++编译整个代码。

它编译得很好,但是我得到了一个链接错误:

CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `operator new(unsigned long, void*)':
svrtH_generator.cc:(.text+0x0): multiple definition of `operator new(unsigned long, void*)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x0): first defined here
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `operator new[](unsigned long, void*)':
svrtH_generator.cc:(.text+0x10): multiple definition of `operator new[](unsigned long, void*)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x10): first defined here
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `operator delete(void*, void*)':
svrtH_generator.cc:(.text+0x20): multiple definition of `operator delete(void*, void*)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x20): first defined here
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `operator delete[](void*, void*)':
svrtH_generator.cc:(.text+0x30): multiple definition of `operator delete[](void*, void*)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x30): first defined here
[you got the idea...]
svrtH_generator.cc:(.text+0x1060): multiple definition of `std::fixed(std::ios_base&)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0xe80): first defined here
collect2: ld returned 1 exit status
make[3]: *** [dev/svrt/libsvrt.so] Error 1
make[2]: *** [dev/svrt/CMakeFiles/svrt.dir/all] Error 2
make[1]: *** [dev/svrt/CMakeFiles/svrt.dir/rule] Error 2
make: *** [svrt] Error 2

我正在使用Cmake构建这个东西,但没有什么真正复杂的。我不知道为什么我会得到所有这些错误,因为我的代码只是一堆方法(我没有使用std包中的任何东西)而且我尝试集成的代码并没有那么复杂。

请注意,警告来自链接我自己的代码,而不是(还)来自新的C ++代码。

有人吗?

编辑:在挖掘外部代码后我尝试集成,我发现一些包括:

#include <iostream> 
#include <cmath> 
#include <fstream> 
#include <cfloat> 
#include <stdlib.h> 
#include <string.h> 

此外,iostream也包含在其他标题中,并且所有标题都包含警卫。

更新:我设法清理了一些外部代码并删除了不必要的依赖项。我仍然有一些链接器错误,但更少:

CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `std::abs(long)':
svrtH_generator.cc:(.text+0x0): multiple definition of `std::abs(long)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x0): first defined here
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `__gnu_cxx::abs(long long)':
svrtH_generator.cc:(.text+0x20): multiple definition of `__gnu_cxx::abs(long long)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x20): first defined here
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `__gnu_cxx::div(long long, long long)':
svrtH_generator.cc:(.text+0x40): multiple definition of `__gnu_cxx::div(long long, long long)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x40): first defined here
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `std::div(long, long)':
svrtH_generator.cc:(.text+0x350): multiple definition of `std::div(long, long)'
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x150): first defined here

代码包括cmathcstdlib,并使用默认命名空间引用abs和其他函数。这可能是问题吗?

3 个答案:

答案 0 :(得分:3)

您似乎有一些名为newdelete的函数,这些函数是C ++中用于内存分配的保留关键字。尝试将它们重命名为其他内容(例如svrt_newsvrt_delete)。

这一行实际上也是最有用的:

svrtH_generator.cc:(.text+0x1060): multiple definition of `std::fixed(std::ios_base&)'

你必须以某种方式包含两个版本的iostream标题......

答案 1 :(得分:0)

这看起来有点像你没有include guards的情况。但是所有这些函数看起来都像C ++本机函数一样可疑。你确定你没有包含一些C ++标题吗?

答案 2 :(得分:0)

最后,我能够编译。我找到了一些提示,说我应该摆脱C风格的包含(#include <stdlib.h>),并用C++样式包括(#include <cstdlib>)替换它们。这让事情变得更糟!

将包含放回.h样式(并纠正exernal代码中的不一致)使链接器感到满意。

那,并删除所有未使用的代码和包含在xternal代码中,解决了我的问题。谢谢你的帮助!