C++ 链接时大量std::函数的多个定义
我正在尝试将一些外部代码集成到我的应用程序中。我的代码是纯C,但是新代码是C++,所以我只把我的C文件重命名为.cc,用G++/P>编译整个东西。 它编译得很好,但我得到了大量的链接错误:C++ 链接时大量std::函数的多个定义,c++,c,linker,linker-errors,multiple-definition-error,C++,C,Linker,Linker Errors,Multiple Definition Error,我正在尝试将一些外部代码集成到我的应用程序中。我的代码是纯C,但是新代码是C++,所以我只把我的C文件重命名为.cc,用G++/P>编译整个东西。 它编译得很好,但我得到了大量的链接错误: CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `operator new(unsigned long, void*)': svrtH_generator.cc:(.text+0x0): multiple definition of `operato
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>
代码包括
cmath
和cstdlib
,并使用默认名称空间引用abs和其他函数。这可能是问题吗?< /P> < p>你似乎有一些函数叫做“代码>新< /COD>”和“代码>删除< /代码>,这些是C++中用于内存分配的保留关键字。尝试将它们重命名为其他名称(svrt\u new
,svrt\u delete
)
此外,这一行实际上信息量最大:
svrtH_generator.cc:(.text+0x1060): multiple definition of `std::fixed(std::ios_base&)'
你必须包含两个版本的IoSoad标题……/P>< p>你似乎有一些函数名为“代码>新< /COD>”和“代码>删除< /代码>,这些都是C++中用于内存分配的保留关键字。尝试将它们重命名为其他名称(
svrt\u new
,svrt\u delete
)
此外,这一行实际上信息量最大:
svrtH_generator.cc:(.text+0x1060): multiple definition of `std::fixed(std::ios_base&)'
您必须以某种方式包含两个版本的iostream头…这看起来有点像您没有这样做的情况。但是所有这些函数看起来都像C++的本地函数。你确定你没有包括一些C++头吗? 这看起来有点像你没有做的情况。但是所有这些函数看起来都像C++的本地函数。你确定你不包括一些C++头吗? 最后,我能把事情编译好。我发现一些提示说我应该去掉C风格的include(
#include
),用C++
风格的include(#include
)替换它们。这让事情变得更糟
将include放回.h
样式(并纠正外部代码中的不一致)使链接器感到高兴
这样,从外部代码中删除所有未使用的代码和include,就解决了我的问题。谢谢你们的帮助,伙计们 最后,我终于可以把东西编译了。我发现一些提示说我应该去掉C风格的include(
#include
),用C++
风格的include(#include
)替换它们。这让事情变得更糟
将include放回.h
样式(并纠正外部代码中的不一致)使链接器感到高兴
这样,从外部代码中删除所有未使用的代码和include,就解决了我的问题。谢谢你们的帮助,伙计们 你的代码看起来像什么?包含了什么C++标题?你的代码是什么样子的?有什么C++标题包括?实际上我不…我所有的函数的前缀都和你建议的一样。实际上我不。。。我所有的函数的前缀都和你建议的一样。我做的是包含警卫。我只包含了我的或来自新代码的标题。我将深入研究新代码,看看它们是否包含C++头。我做了包含保护。我只包含了我的或来自新代码的标题。我将深入研究新代码,看看它们是否包含C++头。不规范,;包含C头的标准方法是
。所以,用
,而不是说“它让事情变得更糟了”,找出让你的整体情况更好的方法。我知道!我不知道为什么外部代码的作者不使用标准头,但我已经花了太多时间清理/修复他的代码。现在,它工作了,我有更好的事情要做…好吧,你不应该使用.h版本。不规范,;包含C头的标准方法是
。所以,用
,而不是说“它让事情变得更糟了”,找出让你的整体情况更好的方法。我知道!我不知道为什么外部代码的作者不使用标准头,但我已经花了太多时间清理/修复他的代码。既然成功了,我还有更好的事情要做。。。