链接时多个std :: functions的多个定义 [英] Multiple definition of lots of std:: functions when linking

查看:318
本文介绍了链接时多个std :: functions的多个定义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



但我得到一个链接错误crapton:

  CMakeFiles / svrt.dir / svrtH_generator.cc.o: (unsigned long,void *)':
svrtH_generator.cc:(.text+0x0):多重定义`operator new(unsigned long,void *)'
CMakeFiles / svrt.dir / svrt_generator。 cc.o:svrt_generator.cc :(。text + 0x0):首先定义这里
CMakeFiles / svrt.dir / svrtH_generator.cc.o:在函数`operator new [](unsigned long,void *)'
svrtH_generator.cc:(.text+0x10):多重定义`operator new [](unsigned long,void *)'
CMakeFiles / svrt.dir / svrt_generator.cc.o:svrt_generator.cc :(。text + 0x10):首先在这里定义
CMakeFiles / svrt.dir / svrtH_generator.cc.o:在函数`operator delete(void *,void *)':
svrtH_generator.cc :( .text + 0x20):多重定义`operator delete(void *,void *)'
CMakeFiles / svrt.dir / svrt_generator.cc.o:svrt_generator.cc :(。
CMakeFiles / svrt.dir / svrtH_generator.cc.o:在函数`operator delete [](void *,void *)':
svrtH_generator.cc:(stext+0x30):multiple definition of `operator delete [](void *,void *)'
CMakeFiles / svrt.dir / svrt_generator.cc.o:svrt_generator.cc :(。text + 0x30):首先定义这里
这个想法...]
svrtH_generator.cc:(.text+0x1060):`std :: fixed(std :: ios_base&)'的多重定义
CMakeFiles / svrt.dir / svrt_generator.cc .o:svrt_generator.cc :(。text + 0xe80):首先在这里定义
collect2:ld返回1退出状态
make [3]:*** [dev / svrt / libsvrt.so] 1
make [2]:*** [dev / svrt / CMakeFiles / svrt.dir / all]错误2
make [1]:*** [dev / svrt / CMakeFiles / svrt.dir / rule]错误2
make:*** [svrt]错误2

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



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



任何人?



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

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

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

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

  CMakeFiles / svrt.dir / svrtH_generator.cc.o: std :: abs(long)':
svrtH_generator.cc:(.text+0x0):`std :: abs(long)'的多重定义
CMakeFiles / svrt.dir / svrt_generator.cc。 o:svrt_generator.cc :(。text + 0x0):首先在这里定义
CMakeFiles / svrt.dir / svrtH_generator.cc.o:在函数`__gnu_cxx :: abs(long long)':
svrtH_generator .cc :(。text + 0x20):`__gnu_cxx :: abs(long long)的多重定义'
CMakeFiles / svrt.dir / svrt_generator.cc.o:svrt_generator.cc :(。text + 0x20):首先在这里定义
CMakeFiles / svrt.dir / svrtH_generator.cc.o:在函数`__gnu_cxx :: div(long long,long long)':
svrtH_generator.cc:(.text+0x40):多重定义`__gnu_cxx :: div(long long,long long)'
CMakeFiles / svrt.dir / svrt_generator.cc.o:svrt_generator.cc :(。text + 0x40):首先定义这里
CMakeFiles / svrt.dir / svrtH_generator.cc.o:在函数`std :: div(long,long)':
svrtH_generator.cc:(.text+0x350):`std :: div long,long)'
CMakeFiles / svrt.dir / svrt_generator.cc.o:svrt_generator.cc :(。text + 0x150):首先在这里定义

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

解决方案

最后,我能够使事情编译。我发现一些提示说,我应该摆脱C风格包括( #include< stdlib.h> )并替换为 C ++ style包含( #include< cstdlib> )。这使事情更糟!



将include包含回到 .h 样式(并纠正与exernal代码的不一致)



这样,删除所有未使用的代码并包含来自xternal代码,解决了我的问题。感谢您的帮助!


I am trying to integrate some external code into my application. My code was pure C, but the new code is C++, so I simply renamed my C files to .cc and compiled the whole thing with g++.

It compiles fine, but I get a crapton of link errors :

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

I'm using Cmake to build the thing, but nothing really complicated. I don't know why I get all these errors, as my code is just a bunch of methods (I don't use anything from the std package) and the code I try to integrate is not much more complicated.

Note that the warning comes from linking my own code, and not (yet) from the new C++ code.

Anybody ?

EDIT: after digging in the external code I try to integrate, I found some includes :

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

Also, iostream is included in other headers, too, and all of them have include guards.

UPDATE: I managed to clean a bit the external code and remove the unnecessary dependencies. I still have some linker errors, but much less :

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

The code includes both cmath and cstdlib, and refers to abs and other functions using a default namespace. May this be the problem ?

解决方案

Finally, I was able to make things compile. I found some hints saying that I should get rid of C-style includes (#include <stdlib.h>) and replace them with C++ style includes (#include <cstdlib>). This made things worse !

Putting the includes back to .h style (and correcting the inconsistencies about that in the exernal code) made the linker happy.

That, and removing all unused code and includes from the xternal code, solved my problem. Thanks for your help guys !

这篇关于链接时多个std :: functions的多个定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆