编译DLL时导出符号 - MSVC

时间:2010-11-25 11:32:41

标签: c visual-c++ cmake

我有一个使用CMake作为构建系统的共享库。它在使用GCC的Linux机器上编译很好。现在我正在尝试在Windows上编译。在指定之前,MSVC不会导出符号。我知道__declspec(dllexport)。但是CMake维基中提供的示例令人困惑。请考虑以下代码。

#if defined (_WIN32) 
  #if defined(MyLibrary_EXPORTS)
    #define  MYLIB_EXPORT __declspec(dllexport)
  #else
    #define  MYLIB_EXPORT __declspec(dllimport)
  #endif /* MyLibrary_EXPORTS */
#else /* defined (_WIN32) */
 #define MYLIB_EXPORT
#endif

我理解__declspec(dllexport),但想知道为什么使用__declspec(dllimport)?另外我该如何使用它?是MYLIB_EXPORT void function()吗?

考虑我有一个名为foo()的C函数。这在内部使用了几个static函数。导出时我还需要导出静态函数吗?或者只导出属于API的入口函数吗?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:5)

只导出作为API一部分的入口函数就足够了。无需导出静态函数。

此外,无需使用__declspec(dllimport)进行功能。仅需要数据。 Windows将自动执行导入功能。

以下链接可能会有所帮助:

http://msdn.microsoft.com/en-us/library/ms235636(VS.80).aspx

http://msdn.microsoft.com/en-us/library/ms682589(VS.85).aspx

答案 1 :(得分:1)

这通常用于由库编译和客户端使用的头文件;当您在库中包含标题时,您定义MyLibrary_EXPORTS并导出符号,当您在客户端应用中包含标题时,它将导入它们。

不,您只需要导出API入口点 - 您不需要导出静态函数。