【问题标题】:External library dependencies in a c++ projectc++ 项目中的外部库依赖项
【发布时间】:2013-11-04 15:56:29
【问题描述】:

我目前正在尝试在 C++ 中设置一个项目,b 使用 luabind 库。不幸的是,在我的发行版 Arch 上,这个库不在官方 repos 中,而且 AUR 中的库已经过时并且无法编译。

考虑到我只需要这个项目的库,我认为我可以通过构建库然后在我的项目的 2 个子目录中安装(复制)包含文件和生成的二进制文件来创建类似于 python 的 virtualenv 的沙盒环境includelib,我将分别添加到链接中并在构建时包含路径。我理解为什么将库与您的项目一起分发是不好的:例如同时进行安全性和错误修复。然而,分发 DLL 几乎普遍在 Windows 上完成(如果我交叉编译我可能会这样做),并且许多项目(如 Linux 上的游戏)倾向于打包它们的库以避免 disrtos 之间的不一致。此外,如果需要一个 lib 的补丁或分叉版本,我怀疑我永远不会在任何官方 repo 中找到它。

所以我的问题是:

  • 我上面描述的是一种常见的做法吗?我应该这样做吗?
  • 如果不是,这个问题最普遍认可的解决方案是什么?

注意:如果重要的话,我使用 Cmake 进行构建自动化

编辑: This question 与我的略有重叠。

【问题讨论】:

    标签: c++ libraries build-dependencies


    【解决方案1】:

    你的方法很有趣,但你没有必要设计一个工作系统,因为它已经完成了,幸运的是,你离解决方案只有一步之遥!

    使用 CMake,使用 ExternalProject 模块可以轻松自动构建和链接外部源代码。

    有关有用信息,请参阅http://www.kitware.com/media/html/BuildingExternalProjectsWithCMake2.8.html

    这种方法有几个优点:

    • 您不必将库的源代码包含在您的存储库中
    • 如果您确定它不会破坏兼容性,您可以指向您知道可与您的软件一起使用的库的特定版本/git 标签或最新版本
    • 您不必编写完整的 CMakeLists.txt 文件来构建可能很复杂的代码库
    • 您最终可以将外部项目配置为构建为静态库,这样您就不必分发共享库
    • 如果没有必要,您甚至可以完全绕过这个问题,方法是尝试使用通常的 find_package 调用来检测系统上库的工作版本,如果没有找到,则只回退到将其构建为外部项目

    【讨论】:

    • +1 cmake 一直很方便。但是,即使使用 ExternalProject 模块,我仍然觉得所有库安装都在污染我的系统。如果我将安装路径(库和头文件)设置在项目的工作目录中可以吗?(至少对于调试版本,如果可用,发行版可能会链接到系统库或包含它们)
    • 是的,它应该是这样工作的。安装目录应位于 CMAKE_BINARY_DIR 下。整个过程假定没有系统范围的修改。
    猜你喜欢
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    相关资源
    最近更新 更多