2010-02-05 2 views
0

내 응용 프로그램에 일부 외부 코드를 통합하려고합니다. 내 코드는 순수한 C이지만 새로운 코드는 C++이므로 내 C 파일의 이름을 .cc로 변경하고 g ++로 모든 것을 컴파일했습니다.여러 정의의 std :: functions 연결할 때

그것은 잘 컴파일,하지만 난 링크 오류의 crapton 얻을 : 나는이 일을 구축 할 Cmake를 사용하고

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 

,하지만 아무것도 정말 복잡하지 않습니다. 나는 왜 내가이 모든 에러를 얻었는지 모르겠다. 왜냐하면 내 코드는 여러 가지 방법 (나는 표준 패키지에서 아무 것도 사용하지 않는다)이고 통합하려고 시도하는 코드는 훨씬 복잡하지 않기 때문이다.

경고는 새로운 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 포함하고 복근과 기본 네임 스페이스를 사용하여 다른 기능을 의미합니다. 이것이 문제가 될 수 있습니까?

+0

코드의 모양은 무엇입니까? C++ 헤더는 어떻게 포함됩니까? – jalf

답변

0

마지막으로 나는 물건을 컴파일 할 수있었습니다. C 스타일을 없애고 (#include <stdlib.h>) 포함하고 C++ 스타일로 바꾸려면 (#include <cstdlib>)을 포함하는 힌트를 발견했습니다. 이것은 상황을 더욱 악화 시켰습니다!

인클루드 백을 .h 스타일로 바꾸고 (외래 코드의 불일치를 수정하여) 링커를 행복하게 만들었습니다.

즉, 모든 사용되지 않는 코드를 제거하고 xternal 코드에서 포함하여 내 문제를 해결했습니다. 도와 줘서 고마워!

+3

글쎄, .h 버전을 사용하면 안된다. 표준이 아닙니다. C 헤더를 포함하는 표준 방법은''입니다. 그래서 * ''을 사용하고 "더 나쁘게 만들었다"고 말하지 말고 전반적인 상황을 더 잘 만들 수있는 방법을 찾으십시오. – GManNickG

+0

알아! 외부 코드 작성자가 표준 헤더를 사용하지 않은 이유는 모르지만 코드 정리/수정에 너무 많은 시간을 소비했습니다. 이제는 효과가 있으며, 할 일이 더 많습니다 ... – Wookai

3

newdelete이라는 일부 함수가있는 것 같으며 이는 메모리 할당을 위해 C++에서 예약 된 키워드입니다. 다른 이름으로 바꾸십시오 (예 : svrt_new, svrt_delete).

또한이 라인은 실제로 가장 유익 :

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

당신은이 종류의 당신이 include guards하지 않은 상황처럼 보인다

+0

사실 나는 ... 내 모든 기능은 당신이 제안한 것과 비슷하게 접두사가 붙지 않는다. – Wookai

0

iostream 헤더의 두 가지 버전을 ... 어떻게 든이 포함되어야합니다. 하지만이 모든 기능은 C++ 기본 기능처럼 의심스럽게 보입니다. C++ 헤더를 포함하지 않으시겠습니까?

+0

나는 경호원을 포함시켰다. 그리고 내가 포함하는 유일한 헤더는 내 코드이거나 새로운 코드입니다. 새 코드에서 C++ 헤더를 포함하는지 더 자세히 살펴볼 것입니다. – Wookai