gcc バージョン 4.7.2 を使用して Windows DLL を作成しようとしていますが、内部で例外を使用すると問題が発生します。DLL コードtest()
で、同じメソッドでキャッチされたメソッドで見つかった例外をスローしています。以下は、main.cpp にあるコードです。
#include <cstdlib>
#include <windows.h>
#include <iostream>
#include "dllexport.h"
using namespace std;
ADDAPI int test()
{
try
{
throw 2;
}catch(...)
{
std::cout << "Caught";
return 1;
}
return 0;
}
//Link to correct DllMain if C++ is used
#ifdef __cplusplus
extern "C"
#endif
BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD reason, LPVOID lpReserved)
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
および dllexport.h にある関連するヘッダー
#ifndef DLLEXPORT_H
#define DLLEXPORT_H
/* Define calling convention in one place, for convenience. */
#define ADDCALL __stdcall
/* Usually format is ADDAPI int ADDCALL Add(int a, int b)...
but moving ADDCALL near ADDAPI works in gcc */
/* You should define BUILDING_DLL *only* when building the DLL. */
#ifdef BUILDING_DLL
#define ADDAPI __declspec(dllexport) ADDCALL
#else
#define ADDAPI __declspec(dllimport) ADDCALL
#endif
#ifdef __cplusplus
extern "C" {
#endif
ADDAPI int test();
#ifdef __cplusplus
}
#endif
#endif /* DLLEXPORT_H */
これは正常にコンパイルされますが、リンクしているプロセスからテスト メソッドを呼び出そうとすると、次のエラーが返されます。
このアプリケーションは、異常な方法で終了するようランタイムに要求しました。
次を使用してdllをコンパイルします。
g++ -c main.cpp -O3 -DBUILDING_DLL
g++ -o mydll.dll main.o -shared -static-libgcc -static-libstdc++ -Wl,--add-stdcall-alias
さらに、 を使用してクライアント アプリケーションをコンパイルします-lmydll
。DLL から例外をスローしてプロセスでキャッチするのは危険であることは理解していますが、例外はすべて DLL の内部で処理されるため、そうしていません。
私は何を間違っていますか?
編集:
libstdc++ の DLL への静的リンクを削除すると、問題が解決します。ただし、自己完結型にするために、DLL がすべての依存関係を内部的に解決することが理想的です。上記を達成するにはどうすればよいですか?