Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链接时大量std::函数的多个定义_C++_C_Linker_Linker Errors_Multiple Definition Error - Fatal编程技术网

C++ 链接时大量std::函数的多个定义

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

我正在尝试将一些外部代码集成到我的应用程序中。我的代码是纯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 `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头的标准方法是
。所以,用
,而不是说“它让事情变得更糟了”,找出让你的整体情况更好的方法。我知道!我不知道为什么外部代码的作者不使用标准头,但我已经花了太多时间清理/修复他的代码。既然成功了,我还有更好的事情要做。。。