C ++跨平台动态库; Linux和Windows

时间:2009-08-05 19:11:06

标签: c++ cross-platform shared-libraries

我需要一些关于编写跨平台代码的帮助;不是应用程序,而是库。

我正在创建一个静态和动态的库,大部分开发都是在Linux中完成的,我已经在Linux中生成了静态和共享库,但现在想要生成一个Windows版本的静态和动态库,形式为: .lib.dll使用相同的源代码。

这可能吗?我有点担心,因为我注意到使用.dll或源代码中类似的东西生成了所需的Windows _dllspec文件。

如果没有,那么任何人都可以建议我在Windows上编译我的代码的最佳和最快的解决方案。我不需要在Linux下进行编译我很乐意直接在Windows下进行编译。另外我使用两个外部库,它们是我在Windows和Linux系统上安装的boost和Xerces XML,所以希望它们不应该成为问题。

我真正想要的是拥有一个可以在Linux和Windows下编译的单一源代码副本,以生成特定于每个平台的库。我真的不在乎是否必须编辑我的代码以支持Windows或Linux,只要我有一个源代码副本。

3 个答案:

答案 0 :(得分:19)

一般来说,您需要关注两个问题:

  1. 要求在Windows上,您的DLL明确导出应该对外界可见的符号(通过__declspec(dllexport)
  2. 能够维护构建系统(理想情况下,不必维护单独的makefile和Microsoft Visual C ++项目/解决方案)
  3. 首先,您需要了解__declspec(dllexport)。在仅限Windows的项目中,通常这是按照我在this question的答案中描述的方式实现的。您可以通过确保定义导出符号(例如MY_PROJECT_API)并在构建Linux时扩展为空来进一步扩展此步骤。这样,您可以根据Windows的需要将导出符号添加到代码中,而不会影响Linux构建。

    对于第二种,您可以研究某种跨平台构建系统。

    如果您对GNU工具集感到满意,可能需要调查libtool(可能与automake和autoconf一起)。 这些工具在Linux上本机支持,并通过CygwinMinGW/MSYS在Windows上受支持。 MinGW还为您提供了交叉编译选项,即在运行Linux时构建本机Windows二进制文件。我发现在导航Autotools(包括libtool)方面有用的两个资源是"Autobook"(特别是关于DLLs and Libtool的部分)和Alexandre Duret-Lutz's PowerPoint slides

    正如其他人所说,CMake也是一种选择,但我不能自己说话。

答案 1 :(得分:9)

你很容易用#ifdef来做。在Windows上_WIN32应由编译器定义(即使是64位),因此代码如

#ifdef _WIN32
#  define EXPORTIT __declspec( dllexport )
#else
#  define EXPORTIT
#endif

EXPORTIT int somefunction();

应该对你有用。

答案 2 :(得分:7)

如果你添加extern“C”!!!,

,也许会更好

/ *文件CMakeLists.txt * /

 SET (LIB_TYPE SHARED)
 ADD_LIBRARY(MyLibrary ${LIB_TYPE} MyLibrary.h)

/ * file MyLibrary.h * /

#if defined(_WIN32) || defined(__WIN32__)
#  if defined(MyLibrary_EXPORTS) // add by CMake 
#    define  MYLIB_EXPORT extern "C" __declspec(dllexport)
#  else
#    define  MYLIB_EXPORT extern "C" __declspec(dllimport)
#  endif // MyLibrary_EXPORTS
#elif defined(linux) || defined(__linux)
# define MYLIB_EXPORT
#endif

MYLIB_EXPORT inline int Function(int a) {
    return a;
}
相关问题