8

我打算在我的 C++ 程序中使用库。开发正在 Linux 上进行,但应用程序旨在同时在 Linux 和 Windows 上编译。我理解 Windows 中共享库(.so)的直接等效项是 DLL,对吗?

在使用 g++ 的 Linux 中,我可以使用-fPIC-shared标志创建共享库。AFAIK,共享库不需要其他代码更改。但在 Windows DLL 中情况有所不同。在那里我应该指定必须使用dllexport导出的函数,对吗?

我的问题是我该如何处理这种情况?我的意思是dllexport在 Linux 中无效,编译器会报错。但它在 Windows 中是必需的。那么如何编写一个可以在两个平台上编译而无需任何代码更改的函数呢?

使用的编译器

  • g++ - LINUX
  • VC++ - 视窗

任何帮助都会很棒!

4

4 回答 4

9

我们__declspec(dllexport)为类指定:

#define EXPORT_XX __declspec(dllexport)

class EXPORT_XX A
{
};

然后您可以检查平台并仅在 Windows 上定义宏。例如:

#ifdef WIN32
#define EXPORT_XX __declspec(dllexport)
#else
#define EXPORT_XX
#endif

我们主要构建静态库,因此动态库可能需要做更多的事情,但概念是相同的 - 使用预处理器宏来定义您需要插入到 Windows 代码中的字符串。

于 2009-06-09T03:02:56.943 回答
5

另一种选择是只为您的 Windows 项目使用 .def 文件。此文件指定 DLL 导出,因此您不必弄乱您的代码库。(但如果你想避免额外的文件,宏肯定是要走的路。)

于 2009-06-09T03:04:53.380 回答
2

您可以使用#ifdef预处理器指令进行条件编译。例如:

#ifdef WIN32
    // Win32 specific code
#else
    // Elsewhere
#endif
于 2009-06-09T03:02:22.670 回答
1

我现在使用的另一种选择是在 Windows上使用MinGW 。这样就可以在 Windows 上使用 gcc,而且不用担心 declspec 的废话。

于 2009-06-09T04:27:50.870 回答