可能是一个简单的问题,但我只有Linux来测试不需要__declspec(dllexport)的代码。在当前的代码中__declspec(dllexport)位于.h文件中的所有文件的前面,但就在cpp文件中50%的函数前面,所以我想知道它们是否真的需要在cpp文件中?
答案 0 :(得分:14)
不,它只需要在标题中。
这是一个link,其中包含更多信息。
扩展Vinay所说的话,我经常看到一个宏定义
#if defined(MODULENAME_IMPORT)
#define EXPORTED __declspec(dllimport)
#elif defined(MODULENAME_EXPORT)
#define EXPORTED __declspec(dllexport)
#endif
然后在你的标题中
void EXPORTED foo();
在执行导入/导出的项目的项目设置中相应地设置定义。
答案 1 :(得分:7)
不,在cpp文件中不需要它。只有在声明中才需要它。
例如,如果我有一个类CMyClass。如果我想导出它,那么.h将有
.h服务器代码
__ declspec(dllexport)CMyClass { };
在客户端代码中,即使用此类,您必须将类声明为
客户端代码
__ declspec(dllimport)CMyClass;
//使用类
的代码答案 2 :(得分:2)
当您使用模板化代码并且在.cpp文件中实例化时,也可以在.cpp文件中使用,然后在实例化时需要导出定义。但即使在这种情况下,我也看到在.h中也可以。在Windows上,您可以使用dumpbin.exe / exports * .dll来查看导出的签名,Linux中也有类似的实用程序。这将让您了解如何导出签名。