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

时间:2018-07-24 05:41:24

标签: c++

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

我知道这个问题可能太笼统了,但是我只是找不到很好的教程,因此请尝试在这里寻求帮助。

我是C ++的新手,以前我的主要编程语言是Java和Python。 C ++管理第三方库的方式在某种程度上让我感到困惑……虽然Python可以轻松地使用pip安装东西,而Java可以导入JAR,但C ++如何组织这些东西?

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

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

  2. 有些C ++ lib都是源代码,有些包含sth。像.so.dll,那是什么?有什么区别?我看到一些lib在说它可以只包含几个头就可以使用,但是有些需要静态链接,这是什么意思?

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

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

再次对这样的普遍性问题和某种不透明的问题感到抱歉,但是我完全迷失为C ++的新手,它比我以前使用的Python和Java复杂得多。...

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

2 个答案:

答案 0 :(得分:2)

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

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

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

从技术上讲,C ++编译器仅涉及步骤2(实际上仅涉及步骤2的 part )。

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

对于头文件,(常用)命令行选项-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等)来查找和安装库。然后,库及其头文件将安装在默认位置。您仍然需要设置构建环境以实际上链接到库。

答案 1 :(得分:1)

通常的方式是,您将第三方内容作为.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