我正在尝试使用 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 在内部解析所有依赖项,以使其自包含,那将是理想的。我能做些什么来达到上述目标?