【问题标题】:How C++ organize(manage) third-party lib? [closed]C++ 如何组织(管理)第三方库? [关闭]
【发布时间】:2018-12-31 15:18:48
【问题描述】:

(我刚刚将问题编辑得更具体)

我知道这个问题可能太笼统而无法回答,但我就是找不到很好的教程,所以想在这里寻求帮助。

我是 C++ 新手,以前我的主要编程语言是 Java 和 Python。 C++管理第三方库的方式让我有些困惑……Python可以通过pip轻松安装东西,Java可以导入JAR,C++如何组织这些东西?

我想将我的问题分成几个部分: 这是我的一些理解和问题:

  1. 只要编译器或 IDE 知道 lib 的路径,那么一切都很好。所以当说install时,我们只是将lib的路径添加到某个系统路径中。对于 IDE,我们只需配置设置,以便它可以解析给定路径中的库。如有错误请指正。

  2. 有些 C++ lib 都是源代码,有些包含。比如.so.dll,那是什么?有什么区别?我看到一些lib说它可以简单地包含一些头文件,但有些需要静态链接,这是什么意思?

  3. 管理所有这些库的一般好方法是什么? (例如,在 python 中,pip 将简单地安装到某个全局范围,或者我们使用 vitrual env 来管理它。那么类似于 C++ 中的 pip 吗?

  4. 更具体地说,我使用的是 CLion,而 Clion 使用的是 CMake,所以也许我要做的就是正确配置 CMakeList.text,然后 IDE 将解析所有 lib 并正确编译?

再次为这种笼统且不知何故不透明的问题感到抱歉,但作为 C++ 的新手,我完全迷失了,这比我以前使用的 Python 和 Java 复杂得多.....

任何好的教程可能会有很大帮助,谢谢!

【问题讨论】:

    标签: c++


    【解决方案1】:

    C++ 没有。 C++ 是一种语言,不是特定的编译器或实现。

    话虽如此,对于大多数编译器来说,构建 C++ 应用程序是通过多个步骤完成的:

    1. 编辑
    2. 编译成目标文件
    3. 链接到可执行文件。

    C++ 编译器在技术上只涉及第 2 步(实际上只涉及第 2 步的部分)。

    从很久以前开始,大多数编译器和链接器都允许您将头文件和库文件放在任何地方,然后在命令行上将标志传递给编译器和链接器,告诉编译器和链接器在哪里找到文件。

    对于头文件,(常用)命令行选项-I(大写i)用于添加要搜索头文件的路径。对于库,选项-L 类似地添加了一个路径以供链接器搜索库。当然,编译器和链接器中内置了默认路径,-I-L 选项添加到这些默认值中。

    然后与实际库链接,链接器选项-l(小写L)是常用的选项。每个-l 选项列出一个需要链接到可执行文件的库。


    关于 CMake 和 CLion,CLion IDE 并没有真正链接任何东西。相反,它使用 CMake 创建一组 makefiles,其中包含用于构建目标的信息。


    最后,还有一些 C 和 C++ 替代 PIP 或其他语言包管理器,但通常您使用标准方式在系统上安装程序和库。

    与在 Windows 上一样,您可以找到一个安装程序,然后修改您的项目设置(使用 CMake CMakeLists.txt、原始 Makefile 或 IDE 设置)以添加所需的目录。

    对于 Linux 系统,您使用标准包管理器(如基于 Debian 的系统上的 apt 或基于 Fedora 的系统上的 yum 等)来查找和安装库。然后库及其头文件将安装在默认位置。您仍然需要设置构建环境以实际链接 到库。

    【讨论】:

    • 吹毛求疵,但标准中指定了标准库以及具有多个编译单元的能力。所以 compiler 只涉及到第 2 步,但是语言指定了第 3 步的一个(非常小的)部分。
    • 感谢您的回答。所以对于任何 IDE,只要我配置正确(这意味着添加任何库的路径以便 IDE 能够解析它),那么 IDE 会正常工作吗? (顺便说一句,我只是将我的问题编辑得更清楚)
    • @ZiqiLiu 没错。如果您只是将正确的东西放在正确的位置(例如 target_link_libraries 中的库在您的 CMakeLists.txt 文件中),那么它应该“正常工作”:)
    • @SergeBallesta 不是标准库指定只是作为将符号引入相关名称空间的一堆标头?实际机制留给实现。
    • @Caleth:该标准完全规定了标准库的类和函数的行为。并且一致的实现应尊重这一点。话虽如此,除了它应该从格式良好的编译单元和库模块生成一个可执行文件之外,关于链接阶段的说法很少。
    【解决方案2】:

    常见的方法是,您将第三方内容作为 .dll 包含,或者您可以将其直接包含为代码(例如 boost ...您必须加载它并使其工作,您只需包含这些部分你想要,对于 boost 的某些部分,你必须使用你的编译器设置来构建它并包含 .dll)

    像你想要的经理的事情我现在才从 VisualStudio 和 NuGet。我不知道 CLion 是否有这样的东西。

    作为示例,您可以查看 opencv 中的示例:

    https://docs.opencv.org/master/d3/d52/tutorial_windows_install.html

    对于您的问题:

    1. 正确。但如果 lib 还必须匹配设置(32/64 位,发布/调试)

    2. 如果您只需要包含一些头文件,那么代码将直接包含到您的项目中并与您的代码一起编译。如果您必须将其链接为二进制文件(.dll windows、.so Unix(我认为如果有错误请纠正我))而不是编译代码并将编译后的函数链接到您的代码。

    这里是 .so 的答案: What are .a and .so files?

    这里是静态和动态库: When to use dynamic vs. static libraries

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多