(我刚刚编辑了问题以更加具体)
我知道这个问题可能太笼统了,但是我只是找不到很好的教程,因此请尝试在这里寻求帮助。
我是C ++的新手,以前我的主要编程语言是Java和Python。 C ++管理第三方库的方式在某种程度上让我感到困惑……虽然Python可以轻松地使用pip安装东西,而Java可以导入JAR,但C ++如何组织这些东西?
我想将我的问题分为几个部分: 这是我的一些理解和问题:
只要编译器或IDE知道lib的路径,那么一切都很好。因此,当说install
时,我们只是将lib的路径添加到某些系统路径中。对于IDE,我们只需配置设置,以便它可以解析给定路径中的lib。如果有什么问题请纠正我。
有些C ++ lib都是源代码,有些包含sth。像.so
或.dll
,那是什么?有什么区别?我看到一些lib在说它可以只包含几个头就可以使用,但是有些需要静态链接,这是什么意思?
什么是管理所有这些lib的通用方法? (例如,在python中,pip
会简单地安装到某个全局范围内,或者我们使用vitrual env来进行管理。那么类似于C ++中的pip吗?
更具体地说,我正在使用CLion,而Clion使用CMake,所以也许我要做的只是正确配置CMakeList.text,然后IDE才能解析所有lib并正确编译?
再次对这样的普遍性问题和某种不透明的问题感到抱歉,但是我完全迷失为C ++的新手,它比我以前使用的Python和Java复杂得多。...
任何好的教程都可能有很大的帮助,谢谢!
答案 0 :(得分:2)
C ++ 没有。 C ++是一种语言,而不是特定的编译器或实现。
话虽如此,对于大多数编译器而言,构建C ++应用程序需要分多个步骤:
从技术上讲,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
对于您的问题:
正确。但是如果lib必须同时匹配设置(32/64位,发布/调试)
如果只需要包含一些标头,则该代码将直接包含在您的项目中,并与您的代码一起编译。如果您必须将其链接为二进制文件(.dll Windows,.so Unix(我认为如果有错,请纠正我)),然后将代码编译,然后将编译后的函数链接到代码。
以下是.so的答案: What are .a and .so files?
这里有静态和动态库: When to use dynamic vs. static libraries