我需要一些关于编写跨平台代码的帮助;不是应用程序,而是库。
我正在创建一个静态和动态的库,大部分开发都是在Linux中完成的,我已经在Linux中生成了静态和共享库,但现在想要生成一个Windows版本的静态和动态库,形式为: .lib
和.dll
使用相同的源代码。
这可能吗?我有点担心,因为我注意到使用.dll
或源代码中类似的东西生成了所需的Windows _dllspec
文件。
如果没有,那么任何人都可以建议我在Windows上编译我的代码的最佳和最快的解决方案。我不需要在Linux下进行编译我很乐意直接在Windows下进行编译。另外我使用两个外部库,它们是我在Windows和Linux系统上安装的boost和Xerces XML,所以希望它们不应该成为问题。
我真正想要的是拥有一个可以在Linux和Windows下编译的单一源代码副本,以生成特定于每个平台的库。我真的不在乎是否必须编辑我的代码以支持Windows或Linux,只要我有一个源代码副本。
答案 0 :(得分:19)
一般来说,您需要关注两个问题:
__declspec(dllexport)
和首先,您需要了解__declspec(dllexport)
。在仅限Windows的项目中,通常这是按照我在this question的答案中描述的方式实现的。您可以通过确保定义导出符号(例如MY_PROJECT_API)并在构建Linux时扩展为空来进一步扩展此步骤。这样,您可以根据Windows的需要将导出符号添加到代码中,而不会影响Linux构建。
对于第二种,您可以研究某种跨平台构建系统。
如果您对GNU工具集感到满意,可能需要调查libtool(可能与automake和autoconf一起)。 这些工具在Linux上本机支持,并通过Cygwin或MinGW/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;
}