【问题标题】:Distributing (native C++) libraries on windows在 Windows 上分发(本机 C++)库
【发布时间】:2013-12-12 17:52:51
【问题描述】:

我想与第三方共享一个我用原生 C++ 编写的库。我的意思是我想与使用 Windows 的人共享一个库,提供我开发的功能,我不希望与他们共享源代码。我们可以在这里假设相同的 CPU 架构。

我只直接分享过源代码,而且大多是在 linux 上。因此,确保我可以提供尽可能通用的二进制文件的标准过程对我来说是一个谜。而且我发现在线文档缺乏。

我目前正在共享 .lib 文件,但它似乎暗示只有在链接它的编译器与我用来生成该 lib 文件的编译器相同时,这些才有效。

更常见的方法似乎是动态链接路由 - 提供 .dll。我不太喜欢这样做的开销,因为我的函数和类签名看起来像这样__declspec(dllexport) void __cdecl Function1(void);。由于我的目标是保持跨平台兼容性,我可以想象我的源代码会变成一堆条件编译。此外,除非我走运行时链接路线,否则我将不得不提供一个导入库 .lib,这让我回到了与以前相同的问题。

是否有在 Windows 上分发库的指南? DLL 的运行时链接是唯一现实的方法吗?它可靠吗? (我想到了运行时库冲突的问题)。

【问题讨论】:

  • 通常__declspec(dllexport)被封装在一个宏中,在为Windows构建库时扩展为__declspec(dllexport)__declspec(dllimport) 在 Windows 上使用库时,或者在为其他平台构建时(插入其他平台特定的东西)。但是,如果您走这条路,则需要使用 C 接口,而不是导出类或其他 C++ 东西。即使导入库是由不同的编译器生成的,您也可以链接到导入库。
  • @JamesMcNellis 这是您认为最好的方法吗?这对我来说并不理想,因为我已经编写了我的库来非常广泛地使用观察者模式。我想我不得不迁移到函数指针。哎呀!

标签: c++ dll shared-libraries static-libraries


【解决方案1】:

“导出”在不同编译器和标准库实现中可靠工作的 C++ 类的最简单方法是使用 cppcomponents https://github.com/jbandela/cppcomponents

该库仅是标题,因此不需要构建。它适用于 Linux 和 Windows,并且不需要任何导入库。但是,它确实需要功能强大的 C++11 编译器(gcc 4.7.2、clang 3.2、Visual Studio 2013 都可以)。

  • 支持std::string、vector、tuple等标准类型。
  • 它支持异常。
  • 它还支持可以跨不同编译器使用的 std::function 类对象。
  • 还内置了对事件的支持,可以让您的观察者模式更易于实施。

该库在 Boost 许可下发布,因此可免费用于商业和开源使用。

有关使用它的示例,请查看我的 stackoverflow 对类似问题的回答 https://stackoverflow.com/a/19592553/1858436

将它用于您的库将允许从 Visual C++(调试和发布以及未来版本)以及 GCC 使用单个二进制文件。否则,您将不得不支持调试版本、发布版本和 GCC 版本,并且当新版本出现时必须为该版本重新构建。

如果你有一个具体的小例子说明你想做什么,我可以帮助你。

【讨论】:

    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多