我的问题类似于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库和可预见的未来。
库应该单独构建,我们不希望将它们集成到构建系统中。
据我所知,这里至少有两个自由度:
另一点是,用户应该能够将库与其程序的调试版和优化版本链接起来。 我不是Windows编程方面的专家,但就我在互联网和其他工作开发人员身上所发现的而言,Windows上的调试和发布版本之间存在这种(不同寻常的?)区别。 显然,您无法将调试程序与发布库链接,反之亦然。 这是对的吗?
好的,所以,为了清楚起见,让我再次总结一下这一切: (1)为C ++编译器提供依赖关系C库的最佳方法是什么? (2)如果我们以后也想发布C ++库,让用户使用每个编译器从源代码构建是唯一可行的方法,对吗?
答案 0 :(得分:2)
为C ++编译器提供依赖关系C库的最佳方法是什么?
没有完美的解决方案,但是如果为您认为他们将使用的编译器运送DLL以及相应的头文件和import libraries,您的用户将变得更加轻松对于Visual Studio。请注意,大多数编译器都提供了从DLL二进制文件创建导入库的工具。
您也可以以源代码形式发送库,并提供在不同编译器上构建它们的脚本。
如果我们以后也想发布C ++库,让用户使用每个编译器从源代码构建是唯一可行的方法,对吗?
一般来说,使用导出C ++类和方法的DLL是一个非常糟糕的主意,因为它们是以编译器相关的方式导出的,这有效地迫使您为每个受支持的编译器提供不同的DLL。当我使用C ++库时,我采取了以下措施:
如果我理解这一点,那么您的用户就是构建应用程序的用户,您只需向他们提供您的标题库。因此在我看来,在这种情况下,您需要记录如何将C ++库添加到其应用程序中,也许最好的方法是提供一个完全可用的示例应用程序,该应用程序也可以从源代码构建C ++库,至少针对Visual Studio以及您知道用户可能使用的任何其他编译器。
祝你好运。答案 1 :(得分:1)
为获得最大的二进制兼容性,最好的方法是在Windows平台上将您的c / c ++库公开为COM
COM对象可以从C,C ++和.NET语言中使用