如何解决调用MinGW DLL的MSVC程序
在this short tutorial之后,我陷入了链接由MinGW构建的DLL的阶段。这是我用于练习的两个简单的源代码文件。
foo.cpp for foo.dll
const char *greeting(void)
{
return "Hello,World!";
}
main.cpp for main.exe
#include <cstdio>
const char * greeting(void);
int main(int argc,char *argv[])
{
std::printf("%s\n",greeting());
return 0;
}
我在Windows 10的MSYS2中运行了所有命令。以下是命令及其输出。看起来很浪费时间,但实际上只有最后两行很重要。
### Generate foo.def and foo.dll.
$ g++ foo.cpp -shared -Wall -Wl,--output-def=foo.def -o foo.dll
$ cat foo.def
EXPORTS
_Z8greetingv @1
### Generate foo.lib and foo.exp.
$ lib /machine:x64 /def:foo.def
Microsoft (R) Library Manager Version 14.27.29112.0
Copyright (C) Microsoft Corporation. All rights reserved.
Creating library foo.lib and object foo.exp
### Try to generate .exe file.
$ cl main.cpp foo.lib
Microsoft (R) C/C++ Optimizing Compiler Version 19.27.29112 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
main.cpp
Microsoft (R) Incremental Linker Version 14.27.29112.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:main.exe
"/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\lib\x64"
"/LIBPATH:C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64"
"/LIBPATH:C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x64"
main.obj
foo.lib
main.obj : error LNK2019: unresolved external symbol "char const * __cdecl greeting(void)" (?greeting@@YAPEBDXZ) referenced in function main
main.exe : fatal error LNK1120: 1 unresolved externals
如您所见,最后两行就是问题所在。如果使用extern "C"
更改调用约定,它将起作用。因此,显然,这种神秘的电话会议惯例出了问题。顺便说一下,我是MSVC工具集的新手。因此,也许这是一个愚蠢的问题。有什么提示吗?谢谢。
编辑:请注意,上面的代码应该被编译为C ++代码而不是C代码。它们看起来很简单,当然,其中没有任何面向对象的代码。他们只是一个实验,但我计划将C ++类放入.dll文件(如果可行)。因此,我想知道考虑名称改写是否仍然可行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。