0

我正在尝试将一些外部代码集成到我的应用程序中。我的代码是纯 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

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

4

3 回答 3

3

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

此外,这一行实际上信息最丰富:

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

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

于 2010-02-05T16:59:15.043 回答
0

这看起来有点像您没有包含警卫的情况。但所有这些函数看起来都像 C++ 原生函数。你确定你不包括一些 C++ 头文件吗?

于 2010-02-05T17:28:27.507 回答
0

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

将包含恢复到.h样式(并更正外部代码中的不一致)使链接器感到高兴。

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

于 2010-02-08T21:32:02.350 回答