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

iQ.*_*iQ. 26 c++ cross-platform shared-libraries

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

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

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

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

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

Nic*_*yer 19

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

  1. 要求在Windows上,您的DLL显式导出应该对外界可见的符号(通过__declspec(dllexport),和
  2. 能够维护构建系统(理想情况下,不必维护单独的makefile和Microsoft Visual C++项目/解决方案)

首先,您需要了解__declspec(dllexport).在仅限Windows的项目中,通常这是以我在回答此问题时描述的方式实现的.您可以通过确保定义导出符号(例如MY_PROJECT_API)并在构建Linux时扩展为空来进一步扩展此步骤.这样,您可以根据Windows的需要将导出符号添加到代码中,而不会影响Linux构建.

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

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

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


Rob*_*b K 10

您可以使用#ifdef轻松完成.在Windows上_WIN32应该由编译器定义(即使是64位),所以代码就像

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

EXPORTIT int somefunction();
Run Code Online (Sandbox Code Playgroud)

应该对你有用.


小智 7

也许如果你添加extern"C"更好!!!

/*file CMakeLists.txt*/

 SET (LIB_TYPE SHARED)
 ADD_LIBRARY(MyLibrary ${LIB_TYPE} MyLibrary.h)
Run Code Online (Sandbox Code Playgroud)

/*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;
}
Run Code Online (Sandbox Code Playgroud)

  • 为了上帝的爱,请使用更好的格式! (2认同)