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

コードには と の両方が含まれてcmathおり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&)'

何らかの方法で 2 つのバージョンの iostream ヘッダーを含める必要があります...

于 2010-02-05T16:59:15.043 に答える
0

最後に、物事をコンパイルすることができました。C スタイルのインクルード ( ) を取り除き、スタイルのインクルード ( ) に置き換える必要があるというヒントをいくつか見つけまし#include <stdlib.h>た。これは事態をさらに悪化させました!C++#include <cstdlib>

インクルードを元のスタイルに戻す.h(そして外部コード内の矛盾を修正する) ことで、リンカーは満足しました。

それと、未使用のコードとインクルードをすべて外部コードから削除することで、私の問題は解決しました。助けてくれてありがとう!

于 2010-02-08T21:32:02.350 に答える
0

これは、guards を含めなかった状況のように見えます。しかし、これらの関数はすべて C++ ネイティブ関数のように疑わしく見えます。一部の C++ ヘッダーをインクルードしていませんか?

于 2010-02-05T17:28:27.507 に答える