假设我的dll包含以下内容:
mydll.h
extern "C" void __declspec(dllexport) __stdcall f();
通常在我的应用程序执行静态dll链接时,我只是包含标题,但是阅读有关dllexport vs dllimport规范的内容我想知道我的应用程序是否应该使用以下原型:
extern "C" void __declspec(dllimport) __stdcall f();
我正在为dll和app使用C ++ Builder XE6。
那么,做到这一点的正确方法是什么?
答案 0 :(得分:2)
您必须使用宏来确保使用:
extern "C" void __declspec(dllexport) __stdcall f();
构建DLL时
extern "C" void __declspec(dllimport) __stdcall f();
使用DLL时。
答案 1 :(得分:2)
大多数库使用预处理器为您完成此操作。
它们包含__declspec(dllimport/export)
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
void MYDLL_API __stdcaall f();
当库创建者构建DLL时,他们定义MYDLL_EXPORTS
并导出函数,当客户端包含未定义的头文件时,他们将导入函数。
答案 2 :(得分:0)
如果您的DLL仅导出未修饰的C函数(extern "C"
),则可以跳过所有非标准属性并使用.DEF文件导出必要的函数。如果您的DLL提供少量与C兼容的API,这是一个不错的选择。
理论上,您可以使用带有修饰函数(包括C ++成员函数)的.DEF文件,但它通常不值得付出努力。首先必须弄清楚每个函数是如何装饰(损坏)然后手动将它们添加到.DEF文件中。
如果要导出C ++接口,则需要使用__declspec(dllexport)
和__declspec(dllimport)
,如其他答案所示。