我有一个创建DLL的Visual Studio 2008解决方案。它包括一个静态库。我了解到静态库中导出的“__declspec(dllexport)”函数不会通过DLL公开。我目前的解决方法是定义文件。我想知道的是因为只有声明需要导出为什么我不能在DLL项目中有一个标题,如下所示:
__declspec( dllexport ) function();
并在静态库的源文件中
__declspec( dllexport ) function() { ...contents... }
当将静态库拉入DLL时,不应该使用声明来解析定义,并且声明会导致函数被导出吗?
我也尝试在声明中添加extern。
答案 0 :(得分:0)
问题是链接器在构建DLL时会注意到DLL中的任何内容都不会调用该函数,也不会将其包含在DLL中。您将其标记为导出的事实不会影响链接器的决定。
通常的解决方法是在与导出函数相同的源文件中定义另一个函数,并从同一模块中的其他位置调用该函数(例如,DllMain)。这将确保链接器包含定义导出函数的模块。
Raymond Chen有piece about this on his blog。