1

2 セットのオブジェクトから共有オブジェクトをコンパイルしようとして、このエラーに遭遇しました。最初のセットには、SWIG によって生成された 1 つの cpp ファイルからコンパイルされた 1 つの .os オブジェクトが含まれています。2 番目のセットには、ラップされるインターフェイスを構成する個々のファイルのすべての .so ファイルが含まれています。

$g++ -shared *.os -o Mathlibmodule.so
ld: duplicate symbol std::vector<int, std::allocator<int> >::size() constin Mathlib_wrap.o and Capsule.o

swig c++ ラッパー (Mathlib_wrap.o のソース ファイル) は機械で生成されたもので、見た目が悪く、追跡がさらに困難になるように多くの #define が含まれています。2 番目のセットのすべてのオブジェクト ファイルに再定義が存在するようです。これらすべてのファイルに含まれるヘッダーをたどったところ、#pragma once'd のようです。

問題がどこにあるのかを追跡するために、人々はどのようなアドバイスを持っていますか?

4

2 に答える 2

0

#ifndef/#define によって C++ ライブラリ内のすべてのヘッダー ファイルが適切にブロックされていると仮定します。その後、.iファイルをチェックして、何らかの宣言が実際に重複していないことを確認します。最初にライブラリの小さな断片をインポートしてみてください。

以前にこのような問題に遭遇したことがありますが、それはいつも私がやったばかげたことであることが判明しました. 恐れ入りますが、具体的なことは何もありません。

たぶん.iファイルを投稿してください。

于 2010-06-20T01:51:17.173 に答える
0

疑わしい場合は、エラーの意味を考えてみてください。実際のコードはvector<T>::size、これらのオブジェクト ファイルのそれぞれに対して生成されたものです。関数が使用されている各ファイルで関数がインラインで展開されると予想されるため、これはもちろん非常に珍しいようです。

最初に言うことでなければstd::vector、ヘッダーで定義された関数がインラインで正しくマークされていないということです。コンパイラは、そのヘッダーを含む各ソース ファイルにコードを生成します。使用している g++ のバージョンと、カスタム標準ライブラリ/ベクターの実装を使用していますか?

チェックすることの 1 つは、() を最適化してコンパイルし-O2、それによって実際の関数の作成内で呼び出しがインライン化されるかどうかを確認することです。

もう 1 つの可能性は、2 つの異なるバージョンのvectorインクルードをインクルードしていて、1 つの定義ルールに違反しているということです。その時点で、あなたが見ているようなリンカ エラーを排除しません。

于 2010-06-21T19:36:15.477 に答える