質問
C ++フレームワーク用のCラッパーがあります。これはMacとWindowsで実行されるはずなので、 scons を使用しています:
env = Environment()
env.Append(CPPPATH = ['./'])
env.Append(LIBS = 'kernel32.lib')
env.Append(LIBPATH = 'C:/Program Files/Microsoft SDKs/Windows/v6.0A/Lib')
env.SharedLibrary(target='warpLib', source='warplib.cpp')
warplib.cppおよびwarplib.hの単純なバージョンは次のようになります。
warplib.cpp
#define DllExport __declspec( dllexport )
#include "warplib.h"
extern "C" {
DllExport int foo(int a) {
return a;
}
}
warplib.h
#define DllExport __declspec( dllexport )
extern "C" {
DllExport int foo(int a);
}
誰がそれについて何が悪いのか教えてもらえますか? 「extern" C"」の可能なすべての組み合わせを試しましたしかし、それは常に「エラーC2732:リンケージ仕様が以前の「...」」仕様と矛盾するようなものを投げます。
「extern" C"」をスキップした場合それは機能しますが、.libファイルが表示されず、ライブラリを実際に使用するために必要であると確信しています。
解決
宣言には extern" C"
のみが必要です。そのヘッダーをインクルードする人は誰でも、C ++装飾形式ではなく、Cリンク標準を使用してリンクすることを期待します。 warplib.cpp
ソースファイル、および後続のオブジェクトファイルは、 warplib.h
が含まれている場合、関数 foo
を正しく公開します。
MSVCを使用する場合、多くの半有用なスクリプトがあり、「環境を構築する」コンソールショートカットが提供され、多くの開発関連の環境変数とパスが提供されます。これらの変数を環境に挿入するために実行する適切なスクリプトを見つけるか、開発コンソールを実行することをお勧めします。
所属していません StackOverflow