不忘初心,方得始终:
在此写文章主要是起笔记本的作用,以免之后长时间不用导致知识点遗忘。
知识点记录:
1、使用linux编译C/C++的方式有很多,命令行或者CMakeLists.txt,此处仅记录CMakeLists的用法和编译方法;
2、如果有错误,之后在进行补充。
自己理解的CMakeLists:
我认为的CMakeLists是用来告诉编译器执行代码所需要的环境,以及编译之后产生怎样的结果,如同样的CMakeLists在Windows产生的动态链接库后缀名为.dll,而在Linux环境下产生的动态链接库后缀名为.so,相对于命令行来说更加系统、完整。
需要用到的指令:
1、cmake_minimum_required(VERSION X.XX):此条命令是指定编译时所需要的cmake最低版本,为cmakelists的第一句,如果指定为3.22则使用3.22之前的cmake运行会报错,需要按照开发时的电脑中cmake来设定;
cmake_minimum_required(VERSION 3.21)
2、set(A B):将B的值赋给变量A,之后需要调用变量B的时候只需要${A}即可,注意,在CMakeLists中,${A}为取变量A的值,set中变量的赋值可以多对一,即一个变量可以等同于main.cpp+function.cpp+function.hpp,写法:set(SOURCES_FILE main.cpp function.hpp function.cpp),方便编译;
set(SOURCE_FILES
main.cpp
function.cpp
function.hpp)
3、project(A):将工程的名字命名为A,这句话效果上也等同于set(PROJECT_NAME A),将程序中变量PROJECT_NAME的值赋为A,方便其他语句调用;
project(ProjectOne)
4、add_executable(A B):生成可执行文件,可执行文件的名字是A,用来编译的代码为B,编译完之后可以直接在linux环境下,跳转到当前文件夹,使用./A 生成结果;
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
5、add_library(A SHARED B):生成动态链接库A,其中SHARED的意思是生成动态链接库,该控制词还可为其他,效果可自行查阅,生成的动态链接库为A,源文件为B,在linux下会生成so为后缀的文件,windows下会生成dll为后缀的文件;
add_library("${PROJECT_NAME}-DEV" SHARED ${SOURCE_FILES})
6、include_directories(XX):其中XX为库文件的路径,这句话代表项目需要依赖一些外部库,如在此项目中需要调用Eigen库并提前将Eigen文件夹移到项目路径中,故可有下面写法将Eigen库包含到项目中:
include_directories(./Eigen)
7、使用openCV:使用openCV需要用到一系列指令,但理解了上述原理之后再看就相对简单,不再多做阐述,项目中用到了,故在此将openCV的添加方法列在下面代码段中。
find_package(OpenCV REQUIRED)
# include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(${ProjectOne} ${OpenCV_LIBS})
具体用法(只介绍linux下):
1、cd 到项目文件夹下,即与main.cpp同路径;
2、vim CMakeLists.txt,创建一个CMakeLists文档,并完成编写;
3、cmake .
4、make
其中,3、4步的代码如下:
cmake .
make
即可完成编译工作。
5、编译后生成的文件与CMakeLists中语句有关,如果有add_excutable,则可直接运行程序查看结果。