我正在使用 Visual Studio 2012 创建一个 DLL 项目,目的是从 Delphi 项目中调用函数。我已经通过将我的函数包装在 extern "C" { /* ... */ } 中来关闭 C++ 名称修饰,但为了避免 C 名称修饰,我使用的是 DEF 文件。
这是一段代码,描述了我是如何布置的:
// MyFile.h
#ifdef MYPROJECT_EXPORTS
#define MYPROJECT_API __declspec(dllexport)
#else
#define MYPROJECT_API __declspec(dllimport)
#endif
extern "C" {
extern MYPROJECT_API void __stdcall do_something();
}
.cpp 文件的结构是等效的。一切都很好。
我在我的项目文件夹中添加了一个 .def 文件,其中包含以下内容:
LIBRARY MyProject
EXPORTS
do_something=_do_something@0
当我构建我的项目时,一切正常。但是,当我添加链接器选项时
/DEFS:MyProject.def
我开始收到有关未解决的外部符号的错误。以前有人遇到过这种问题吗?我对 C++ 或 C 都不是新手,但这是我第一次在 Windows 上构建 DLL,因为我主要是 Unix 开发人员。我的假设是我误解或误用了 __declspec 装饰器,因为它仅在我在 def 文件中链接时才会中断:当我从链接器选项中删除该标志时,它会干净地构建,除了 C 风格的装饰符号。
编辑:感谢大家的评论,但我现在已经弄清楚了。我的问题来自于我在创建 DLL 期间的链接阶段使用了 def 文件这一事实。使用 DLL 时我需要使用 def 文件,而不是创建它,而且一切都很好。