Linux学习—编译

不忘初心,方得始终:

        在此写文章主要是起笔记本的作用,以免之后长时间不用导致知识点遗忘。

知识点记录:

        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,则可直接运行程序查看结果。


版权声明:本文为WSNYYDEZ原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。