前言
一般编译项目时会通过编写makefile文件,使用make命令来完成。但是makefile文件编写较为麻烦,所以采用cmake方式自动生成makefile文件,这样我们可以更加关注项目树的构成和编排,省去了编写makefile的时间。
1.项目构成
首先看一下项目构成:
book@100ask:~/nfs_rootfs/v4l2/6th_240609/video_real_time$
一级目录为工程目录video_real_time,最初只有include和src两个字目录,分别包含了头文件和源文件。子目录下的文件构成如下,先忽略掉cmake文件。
2.CMAKE文件编写
根目录的CMakeLists.txt文件
我们在根目录下创建CMakeLists.txt文件。根目录的CMakeLists.txt文件主要完成以下任务:
- 设置最低版本要求
cmake_minimum_required(VERSION 3.8)
- 项目名称
project(video_real_time)
- 这里的项目名称就是一级目录名字
- 交叉编译连的设置
set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) # 交叉编译工具链的前缀 set(CMAKE_C_COMPILER "已安装的交叉编译工具链的绝对路径")//gcc set(CMAKE_CXX_COMPILER "已安装的交叉编译工具链的绝对路径")//g++ # 另外一种组合路径写法 set(CROSS_CHAIN_PATH /home/book/xxx/ToolChain/xxx) set(CMAKE_C_COMPILER "${CROSS_CHAIN_PATH}/arm-xxx-gcc")//gcc set(CMAKE_CXX_COMPILER "${CROSS_CHAIN_PATH}/arm-xxx-g++")//g++
- 如果最后编译的可执行程序需要放到ARM平台上运行,那么就要设置交叉编译工具链,否则不需要。
- 添加头文件搜索路径
根据自己的文件构成去写。include_directories(${PROJECT_SOURCE_DIR}/include) include_directories(${PROJECT_SOURCE_DIR}/include/convert) include_directories(${PROJECT_SOURCE_DIR}/include/display) include_directories(${PROJECT_SOURCE_DIR}/include/render) include_directories(${PROJECT_SOURCE_DIR}/include/video)
- 生成的可执行文件目录
创建bin目录存放可执行程序set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
- 加载到子目录src
到子目录下执行CMakeLists.txt文件add_subdirectory(src)
子目录下的CMakeLists.txt文件
我们在子目录src下创建CMakeLists.txt文件。子目录的CMakeLists.txt文件主要完成以下任务:
- 当前目录下所有源文件生成SRC_LIST
SRC_LIST是自己起的名字aux_source_directory(. SRC_LIST)
- 当前目录下的子目录下的源文件生成xxx_LIST
注意前缀变成了./aux_source_directory(./convert CONVERT_LIST) aux_source_directory(./display DISPLAY_LIST) aux_source_directory(./render RENDER_LIST) aux_source_directory(./video VIDEO_LIST)
- 生成可执行文件xxx 由SRC_list变量和xxx_LIST定义的源文件共同编译而来
xxx为可执行文件的名称,在之前的设置中已经指定了它的文件目录add_executable(xxx ${SRC_LIST} ${CONVERT_LIST} ${DISPLAY_LIST} ${RENDER_LIST} ${VIDEO_LIST})
- 链接必要的库
库名称不带l, 比如target_link_libraries(chatserver pthread muduo )target_link_libraries( 可执行文件名称 lib1 lib2 ... )
3.编译
在build目录中存放makefile相关的文件,是为了不污染项目的整体目录,使文件的存放有序合理,条目清晰。
mkdir build
cd ./build
cmake ..
make
依次执行上述命令,就能完成整个项目的编译。