C++如何组织(管理)第三方库
How C++ organize(manage) third-party lib?
(我刚刚编辑了更具体的问题)
我知道这个问题可能太笼统了,无法回答,但我就是找不到好的教程,所以试着在这里寻求帮助。
我是C++的新手,以前我的主要编程语言是Java和Python。C++管理第三方库的方式让我有些困惑……虽然Python可以很容易地用pip安装东西,但Java可以导入JAR,C++如何组织这些东西?
我想把我的问题分成几个部分:以下是我的一些理解和问题:
-
只要编译器或IDE知道lib的路径,那么一切都很好。所以在说
install
时,我们只是将lib的路径添加到某个系统路径中。对于IDE,我们只需配置设置,以便它可以解析给定路径中的lib。如果有什么不对劲,请纠正我。 -
有些C++库都是源代码,有些包含
.so
或.dll
之类的内容,那是什么?有什么区别?我看到一些lib说,它可以与一起使用,只需包含几个头,但有些需要静态链接,这意味着什么? -
管理所有这些lib的一般好方法是什么?(例如,在python中,
pip
只需安装到某个全局范围,或者我们使用vitrual-env来管理它 -
更具体地说,我使用的是CLion,CLion使用的是CMake,所以也许我所要做的就是正确配置CMakeList.text,然后IDE将解析所有lib并正确编译?
再次为这样一个笼统且不透明的问题感到抱歉,但作为C++的新手,我完全迷失了方向,它比我以前使用的Python和Java复杂得多。。。。。
任何好的教程都可能有很大帮助,谢谢!
C++没有。C++是语言,而不是特定的编译器或实现。
话虽如此,对于大多数编译器来说,构建C++应用程序需要多个步骤:
- 编辑
- 编译为对象文件
- 链接到可执行文件
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
对于您的问题:
-
正确。但如果lib也必须匹配设置(32/64位,发布/调试)
-
如果只需要包含一些头,那么代码将直接包含在项目中,并与代码一起编译。如果你必须将其链接为二进制文件(.dll-windows,.soUnix(我认为如果错误,请纠正我)),则编译代码,并将编译后的函数链接到你的代码。
以下是.so的答案:什么是.a和.so文件?
这里是静态和动态库:何时使用动态库与静态库
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 当vector是tje全局变量时,c++中vector的内存管理
- 如何维护资源管理器项目视图中当前可见的项目列表
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 如何包装第三方DLL在R中使用
- 资源管理设计模式
- 使用"Task"函数指针队列定义作业管理器
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 实现动态插件管理器
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- libcurl 和 DNS ttl 中的内部连接管理
- 第三方 API 中的编译错误 - Visual Studio
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 在C++管理一家中国.txt
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建
- 编译器资源管理器和 GCC 具有不同的输出
- 我们可以通过 IPC 传递具有动态管理成员的类对象吗?
- C++如何组织(管理)第三方库
- 管理第三方库安装C
- 在PInvoke中管理大量的第三方依赖关系,以提高编译速度