2011-02-20 22 views
2

CライブラリにリンクしているCライブラリやC++ライブラリに多くの質問と回答がありましたが、C++にリンクしているC++ライブラリがありますCとC++を混在させる人々と同じ症状(リンク時の未定義参照)。g ++を使用してC++ dllにリンクするC++ライブラリ

は、これは私のG ++ラインです:

g++ -L C:/MyLibraries mycode.cpp -shared -o mycode.dll -lopengl32 -lglu32 -lgdi32 -lMyLibrary 

私は、次のラップ私のヘッダ持っていることについて、これまでの協議に遭遇したすべての答え:

#ifdef __cplusplus 
extern "C" { 
#endif 
... 
#ifdef __cplusplus 
} 
#endif 

しかし、私のライブラリは、純粋なCでの++、 100%クラス、グローバル関数はありません。extern "C"が犠牲にすることはできません(extern "C"はクラスのメソッドではできず、extern "C"リンク時の未定義参照)。

Visual Studio 2010でMyLibrary.libが記述されました。また、Visual Studio 2005と2008を使用して多数のライブラリを作成しました。extern "C"を必要とする人は1人もいませんでした。スタジオベースのプロジェクト。他のC++プロジェクトにリンクされているC++ライブラリ。問題はありません。

これは、Visual Studioがg ++が処理するものですか?静的に多数の自分のC++カスタム静的ライブラリを他のC++プロジェクトにリンクすることができます。 Visual Studioはそれ自身のC++メソッド名のマングルを解読するほどスマートですか?今までこれまで実行したことはありませんか?しかし、g ++は何をすべきか分からず、Cネーミング規則を強制させる必要があります(私は100%C++です)。

また、g ++を使用していても、まだ標準のCルールを適用しているという問題がありますか?私のg ++​​コマンドラインに何か問題がありますか?

dll関数をエクスポートするためのMSDNの回答を探していても、「C関数をC++実行可能ファイルにエクスポート」や「エクスポート」などのテーマがあるため、g ++行に問題があります。 C++の関数をCの実行可能ファイルに変換する "という、C++の関数をC++の実行可能ファイルにエクスポートするリンクはありません。コンパイルされた関数で__declspec(dllexport)を試しましたが、まだg ++とのリンクは未定義です。何か案は?

ありがとうございます。

答えて

7

Visual Studioとg ++は、名前マングリング、vtableレイアウトなどのために非常に異なる規約を使用しているため、(Cインターフェイス経由でのみ通信する場合を除いて)ビルドされたライブラリをリンクすることは安全ではありません。 MinGWサイトのhttp://www.mingw.org/wiki/MixingCompilersに詳細があります。

関連する問題