为什么OpenCV在vscode上使用需要提前进行编译?
OpenCV需要编译的原因是因为它是一个开源的计算机视觉库,它提供了大量的图像处理和计算机视觉算法函数。编译过程将源代码转换为可执行的机器代码,以便在特定平台上运行。
在编译过程中,编译器会将源代码转换为目标代码(.o文件),然后链接器将目标代码和其他依赖项(如库文件)合并为可执行文件或动态链接库(.dll、.so文件),以供应用程序调用和使用。
为什么不直接提供预编译的库文件呢? 这是因为不同的操作系统、硬件平台和编译选项可能会导致库文件不兼容或性能下降。通过提供源代码并让用户自行编译,可以确保根据特定的环境和需求进行优化和配置。
Cmake起到的作用?
Cmake指导整个编译过程(组织编译作用),包括如何编译每个目标文件,如何把目标文件链接成可执行文件或动态库、静态库文件。它按照某种编译器(例如MinGW——著名C/C++编译器GCC的Windows版本)的要求下载项目文件在当前环境(例如windows)下编译所需要的配置文件和书写编译要求(Makefile文件)。但是实际编译文件(也就是make过程)是通过一些编译工具(例如MinGW编译工具链)实现的。
所以这就是为什么先用Cmake gui生成makefile文件和下载相关的配置文件,然后执行命令minGW32-make -j 4和MinGW32-make install,前者实现利用MinGW编译工具链按照Makefile文件要求编译项目文件生成可执行文件和动态链接库,后者则是MinGW工具根据 Makefile 中定义的 “install” 目标规则,执行相关的安装操作。这可能包括复制文件、创建目录、设置权限等。具体的安装操作和目标位置将取决于项目中的Makefile 文件规则。在执行该命令之前,确保 Makefile 文件中已定义了 “install” 目标,并指定了正确的安装路径和相关操作。
两条命令之间的关系:在运行 mingw32-make install 命令之前,通常需要先运行 mingw32-make 命令以构建项目。这将确保生成目标文件和其他必要的构建结果,以便在安装过程中使用。
一些路径意义的说明
include_path和library_path,前者指的是头文件的搜索地址,后者指的是库文件(储存具体函数实现方式)的搜索地址。
下图是vscode中配置OpenCV往系统环境变量中加入的路径,这两条路径实际上指的是opencv中需要用的库文件路径。
而下图中的install中的路径,表示的则是头文件路径。
头文件和库文件具体区别:参考这里
工作目录(cwd)是什么?
工作目录(cwd):工作目录是指执行编译命令时所处的目录,通俗的讲就是编译器所在的目录(例如: “cwd”: "D:/software/MinGw/mingw64/bin"就是工作目录)
${workspaceFolder} :表示当前workspace文件夹路径,也就是需要执行的文件所在目录(例如:“C:\Users\13473\Desktop\program\opencv_cpp\task\test.cpp”)
注意二者区别!
gcc与g++区别
GNU gcc是一个整体,但是在处理c/c++文件时,我们可以分别采用gcc或者g++命令, 两者效果类似,可以理解为g++命令在gcc命令之上又针对c++进行了一层封装, 因此区别主要是对待c/c++文件时的细节处理,例如:
1.g++ 对于.c/.cpp结尾的文件全都默认当作c++文件处理。
2.gcc 对于.c视作c文件,对于.cpp视作c++文件处理。
3.对于STL标准库,如果使用g++会自动链接进来,如果使用gcc则需要加参数-lstdc++显式地完成,并且可能有细节差异。
4.对于预定义宏,两者支持的宏不完全一样。
gcc编译中的-I和-L区别(task.json文件中可能会有)
在 gcc 编译器中,-I 和 -L 是两个不同的选项,用于指定头文件包含目录和库文件搜索路径。-I 选项:用于指定头文件包含目录。它告诉编译器在编译过程中搜索头文件的位置。你可以使用多个 -I 选项来指定多个包含目录,编译器将按照指定的顺序进行搜索。这两个选项是在不同的编译和链接阶段使用,分别用于处理头文件和库文件的定位。
需要注意的是,-I 和 -L 选项仅指定了搜索路径,并不直接将头文件或库文件包含到编译或链接过程中。你仍然需要在源代码中使用 #include 来引入头文件,并使用 -l 选项来链接指定的库文件。