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
一般来说,您需要关注两个问题:
__declspec(dllexport),和首先,您需要了解__declspec(dllexport).在仅限Windows的项目中,通常这是以我在回答此问题时描述的方式实现的.您可以通过确保定义导出符号(例如MY_PROJECT_API)并在构建Linux时扩展为空来进一步扩展此步骤.这样,您可以根据Windows的需要将导出符号添加到代码中,而不会影响Linux构建.
对于第二种,您可以研究某种跨平台构建系统.
如果您对GNU工具集感到满意,可能需要调查libtool(可能与automake和autoconf一起使用).这些工具在Linux上本机支持,并通过Cygwin或MinGW/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)