【问题标题】:Exporting symbols when compiling DLL - MSVC编译 DLL 时导出符号 - MSVC
【发布时间】:2011-05-15 15:53:28
【问题描述】:

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

#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 的入口函数就足够了?

任何帮助将不胜感激。

【问题讨论】:

    标签: c visual-c++ cmake


    【解决方案1】:

    只导出作为 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

    【讨论】:

      【解决方案2】:

      这通常用于你的库和它的客户端都使用的头文件;当您在库中包含标头时,您定义 MyLibrary_EXPORTS 并将导出符号,当您在客户端应用程序中包含标头时,它将改为导入它们。

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

      【讨论】:

        猜你喜欢
        • 2019-10-02
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 2020-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多