我打算在我的C ++程序中使用库。 Linux正在进行开发,但是应用程序可以在Linux和Windows上进行编译。 我知道在Windows中共享库(.so)的直接等价物是DLL,对吧?
在使用g ++的Linux中,我可以使用-fPIC
和-shared
标志创build共享库。 AFAIK,共享库不需要其他代码更改。 但是Windows DLL中的东西是不同的。 在那里我应该指定必须使用dllexport导出的function,对吧?
我的问题是如何处理这种情况? 我的意思是dllexport在Linux中是无效的,编译器会报错。 但在Windows中是必需的。 那么如何编写一个能在两个平台上编译而不需要更改代码的函数呢?
使用的编译器
任何帮助将是伟大的!
我们为类指定__declspec(dllexport)
:
#define EXPORT_XX __declspec(dllexport) class EXPORT_XX A { };
然后你可以检查平台,只在窗口上定义宏。 例如:
#ifdef WIN32 #define EXPORT_XX __declspec(dllexport) #else #define EXPORT_XX #endif
我们主要建立静态库,所以动态库可能有更多的工作要做,但概念是一样的 – 使用预处理器宏来定义你需要插入Windows代码的字符串。
另一种选择是只为您的Windows项目使用.def文件。 这个文件指定了DLL的导出,所以你不必弄乱你的代码库。 (但是,如果你想避免额外的文件,宏指令就是这样。
您可以使用#ifdef
预处理器指令进行条件编译。 例如:
#ifdef WIN32 // Win32 specific code #else // Elsewhere #endif
另一个选项,我现在使用的是在Windows上使用MinGW 。 这样你就可以在Windows上使用gcc了,你不必担心declspec的废话。