我正在尝试移植Win32::Setupsup,这是一个相当硬的旧的基于C ++的模块,旨在使用Visual C ++,它可以用于Strawberry Perl和它使用的MinGW GCC。除了一件事之外,我几乎让它工作了。
模块的C ++部分有一个DllMain
函数,它在DLL_PROCESS_ATTACH
运行一些初始化代码,在DLL_PROCESS_DETACH
运行清理代码。当我使用Visual C ++编译模块时,工作正常。但是当我使用Strawberry Perl使用的MinGW GCC编译它时,DllMain
永远不会被调用。
我认为问题只是DllMain
在使用gcc
编译时未正确识别为DLL的入口点。但我不知道如何解决这个问题。
正在进行的工作在my GitHub repo for Win32::Setupsup。虽然我使用Dist::Zilla来管理版本,但实际上并不需要dzil
来测试它。只需克隆回购,perl Makefile.PL
和dmake test
。
答案 0 :(得分:2)
查看代码,
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved);
在C ++源文件中。因为这是一个C ++函数,所以G ++将名称伪装成类__Z7DllMainP11HINSTANCE__mPv@12
,并且在加载库时无法找到它。
要解决此问题,请在函数声明
上使用extern "C"
extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved);
或在街区
extern "C" {
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved);
}
确保函数被赋予C链接(避免C ++名称重整)。