C++如何组织(管理)第三方库

How C++ organize(manage) third-party lib?

本文关键字:第三方 管理 何组织 C++      更新时间:2023-10-16

(我刚刚编辑了更具体的问题)

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

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

我想把我的问题分成几个部分:以下是我的一些理解和问题:

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

  2. 有些C++库都是源代码,有些包含.so.dll之类的内容,那是什么?有什么区别?我看到一些lib说,它可以与一起使用,只需包含几个头,但有些需要静态链接,这意味着什么?

  3. 管理所有这些lib的一般好方法是什么?(例如,在python中,pip只需安装到某个全局范围,或者我们使用vitrual-env来管理它

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

再次为这样一个笼统且不透明的问题感到抱歉,但作为C++的新手,我完全迷失了方向,它比我以前使用的Python和Java复杂得多。。。。。

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

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

话虽如此,对于大多数编译器来说,构建C++应用程序需要多个步骤:

  1. 编辑
  2. 编译为对象文件
  3. 链接到可执行文件

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

很久以前的大多数编译器和链接器都允许您将头文件和库文件放在任何位置,然后在命令行上有一些传递给编译器和链接程序的标志,告诉编译器和链接者在哪里可以找到文件。

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

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


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


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

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

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

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

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

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

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

对于您的问题:

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

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

以下是.so的答案:什么是.a和.so文件?

这里是静态和动态库:何时使用动态库与静态库