我正在创建一个要在vb.net中导入的c ++ dll。
我发现在dll的头文件中组织导入和导出的最佳方法是以下类型:
#ifndef MY_DLL_EXPORTS
#define MY_DLL_EXPORT __declspec(dllexport)
#else
#define MY_DLL_EXPORT __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C"
{
#endif
MY_DLL_EXPORT BOOL my_function(uint32_t x);
#ifdef __cplusplus
}
#endif
我的问题是,应该在哪里定义__cplusplus和MY_DLL_EXPORTS?
我之前没有这样做,我似乎无法在代码中找到它的位置。我读了一些关于将这些定义放在
中的内容Project Properties -> Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions
我是否将它们放在DLL的项目属性中?如果我这样做,在使用这个DLL时,它们是否总是被定义,所以if语句总是会转到dllimport
?
此外,__cplusplus
已经定义了,还是我必须定义它?
答案 0 :(得分:1)
定义COMPILING_DLL的最佳位置是编译器的命令行。如果您使用Visual Studio IDE,则它位于项目属性... C / C ++ ...预处理器...预处理器定义。
__ declspec(dllimport)是Microsoft特有的C ++扩展。 Microsoft拥有出色的在线文档。
答案 1 :(得分:1)
__cplusplus
是由C ++编译器为您定义的,但不是由C编译器定义的。这是如何确定您的代码是由C或C ++编译器编译的。这就是为什么这用于保护extern "C"
结构。 C编译器会省略它(因为它已经发出C链接)。
其他常量可以在编译器的命令行中定义(例如,在您列出的菜单中),也可以在代码中的某处定义:
#define MY_DLL_EXPORTS