5

C++ Win32 アプリケーションとして作成した DLL があります。DLL での名前マングリングを防ぐために、以下に定義する EXPORT 定義を使用しました。

#ifndef EXPORT
#define EXPORT extern "C" __declspec(dllexport)
#endif

EXPORT int _stdcall SteadyFor(double Par[], double Inlet[], double Outlet[]);

このコードをコンパイルするには、プロジェクトのプロパティに移動し、C/C++Calling Convention__stdcall (/Gz)に設定Compile Asし、Compile as C++ Code (/TP)に設定する必要がありました。

error C2059: syntax error: 'string'これはデバッグ モードでは機能しましたが、リリース モードの設定をデバッグ設定と同じに構成したにもかかわらず、リリース モードではすべての EXPORT 関数がスローされます。

リリース モードをコンパイルするにはどうすればよいですか?

よろしく、
~Joe
(Visual Studio 2008 Professional で開発中)

編集:
私の #define に関する多くのコメントは、問題を引き起こしているようには見えません。

混乱を避けるために、私のヘッダー ファイルは次のように書き直されました。

#ifndef coilmodel_h
#define coilmodel_h

extern "C" __declspec(dllexport) int _stdcall steadyFor(double Par[], double Inlet[], double Outlet[], char* FileIn, char* FileOut);

#endif

それだけです。

エラー:
説明 error C2059: syntax error: 'string'
ファイル coilmodel.h
4

繰り返しますが、このエラーはリリース モードでのみ表示され、デバッグ モードでは表示されません。
プロジェクトは C++ Win32 DLL アプリケーションです。

4

4 に答える 4

8

ソース ファイルに.c拡張子がある場合、使用しているコンパイラはそれを C (C++ ではなく) としてコンパイルし、extern "C". その場合は、/TPすでにメモしたようにスイッチを使用するか、ファイルの名前を.cpp. もう 1 つの解決策は、extern の周りに #ifdefs を配置することです。

#ifdef __cplusplus
extern "C"
#endif
于 2010-06-22T15:59:14.750 に答える
2

EXPORTリリースビルドでは別のものとして定義されていると思います。定義の#ifndef周りにあるので、それが既に定義されている場合は何もしません。関数宣言の先頭に別のもの (おそらく文字列?) が貼り付けられます。

だから多分このようなことを試してください:

#ifdef EXPORT
    #error EXPORT already defined!
#else
    #define EXPORT extern "C" __declspec(dllexport)
#endif
于 2010-06-22T15:31:27.253 に答える
1

Forcing Compile Asto Compile as C++ Code (/TP) - すべてのビルド構成でこれを設定しましたか - デバッグ/リリース x 32/x64 など。私はこのオプションの使用を避けています。

ファイルが C++ の場合、名前マングリングを無効にするために必要なのは の"C"部分だけです。extern "C"

この形式を使用して共有パブリック ヘッダーを配置することを好みます。これにより、C/C++ に内部的または外部的に含めることができます。

#ifdef __cplusplus
# define NOMANGLE extern "C"
#else
# define NOMANGLE
#endif

#ifdef EXPORT_BUILD
# define EXPORT NOMANGLE __declspec(dllexport)
#else
# define EXPORT NOMANGLE __declspec(dllimport)
#endif
于 2010-06-22T16:11:51.027 に答える
0

可能性は低いですが、dllexport または _stdcall が #defined でないことを確認してください...

于 2010-06-22T16:02:15.653 に答える