Windows上C库的二进制交叉编译器兼容性

时间:2011-10-29 16:40:06

标签: c++ c windows binary-compatibility

我的问题类似于this one,但也涉及静态库:

我们有一个跨平台的C ++标头库,可以在Windows / Linux / Os X下很好地构建,可以在多个编译器上运行,32位和64位。 当用户安装了zlib或libbz2时,构建系统通过#ifdefs在库中启用某些功能。

为了方便我们的用户,我们希望以二进制格式或以少量点击安装来源为Windows发布zlib和libbz2等库。 (在Linux和Mac Os X上,可以简单地安装库,因为系统包实际上在大多数标准安装中都可用,据我所知)。

最终解决方案应该使用户能够在32和64位Windows上使用Visual C / C ++编译器2005,2008和2010以及MinGW轻松链接zlib和libbz2。 我们现在只关注C库和可预见的未来。

库应该单独构建,我们不希望将它们集成到构建系统中。

据我所知,这里至少有两个自由度:

  • 是否使用静态库或DLL。
  • 是否发布二进制库或让用户构建自己的库。

另一点是,用户应该能够将库与其程序的调试版和优化版本链接起来。 我不是Windows编程方面的专家,但就我在互联网和其他工作开发人员身上所发现的而言,Windows上的调试和发布版本之间存在这种(不同寻常的?)区别。 显然,您无法将调试程序与发布库链接,反之亦然。 这是对的吗?

好的,所以,为了清楚起见,让我再次总结一下这一切: (1)为C ++编译器提供依赖关系C库的最佳方法是什么? (2)如果我们以后也想发布C ++库,让用户使用每个编译器从源代码构建是唯一可行的方法,对吗?

2 个答案:

答案 0 :(得分:2)

  

为C ++编译器提供依赖关系C库的最佳方法是什么?

没有完美的解决方案,但是如果为您认为他们将使用的编译器运送DLL以及相应的头文件和import libraries,您的用户将变得更加轻松对于Visual Studio。请注意,大多数编译器都提供了从DLL二进制文件创建导入库的工具。

您也可以以源代码形式发送库,并提供在不同编译器上构建它们的脚本。

  

如果我们以后也想发布C ++库,让用户使用每个编译器从源代码构建是唯一可行的方法,对吗?

一般来说,使用导出C ++类和方法的DLL是一个非常糟糕的主意,因为它们是以编译器相关的方式导出的,这有效地迫使您为每个受支持的编译器提供不同的DLL。当我使用C ++库时,我采取了以下措施:

  1. 构建静态库,而不是DLL。
  2. 将C ++库的构建合并到我的项目构建中(例如,作为依赖项目),确保所有内容都由同一个编译器构建。
  3. 如果我理解这一点,那么您的用户就是构建应用程序的用户,您只需向他们提供您的标题库。因此在我看来,在这种情况下,您需要记录如何将C ++库添加到其应用程序中,也许最好的方法是提供一个完全可用的示例应用程序,该应用程序也可以从源代码构建C ++库,至少针对Visual Studio以及您知道用户可能使用的任何其他编译器。

    祝你好运。

答案 1 :(得分:1)

为获得最大的二进制兼容性,最好的方法是在Windows平台上将您的c / c ++库公开为COM

COM对象可以从C,C ++和.NET语言中使用