代码之家  ›  专栏  ›  技术社区  ›  Navaneeth K N

编译DLL时导出符号-MSVC

  •  4
  • Navaneeth K N  · 技术社区  · 14 年前

    我有一个使用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(数据链路端口) 但是想知道为什么 __declspec(dllimport) 使用了吗?我怎么用这个?是不是像 MYLIB_EXPORT void function() ?

    假设我有一个名为 foo() . 这在内部使用了 static 功能。导出时是否也需要导出静态函数?或者仅仅导出属于API的入口函数就足够了吗?

    任何帮助都将不胜感激。

    2 回复  |  直到 14 年前
        1
  •  5
  •   Jay    14 年前

    只导出作为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
  •  1
  •   Rup    14 年前

    它通常用于头文件,库和其客户机都使用该头文件进行编译;当库中包含头文件时,定义 MyLibrary_EXPORTS 它将导出符号,当你在客户端应用程序中包含头时,它将导入它们。

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