前言
cmake的作用,其实就是自动生成makefile,从而简化了makefile的编写,使其更加简单快捷。
先附上完整工程的cmake
- 主CMakeLists
cmake_minimum_required (VERSION 2.6) project (SmartHome) # 版本号 1.0 set (Tutorial_VERSION_MAJOR 1) set (Tutorial_VERSION_MINOR 0)# 头文件位置 include_directories ("${PROJECT_SOURCE_DIR}/include/") include_directories ("/home/xw/pi/") include_directories ("/home/xw/curl-7.71.1/_install/include/")# 子目录构建 add_subdirectory (input_factory bin) add_subdirectory (output_factory bin) add_subdirectory (camera_and_exit)# 目录下所有源文件,加入到变量,方便后面的编译 aux_source_directory (${PROJECT_SOURCE_DIR}/main SRC_LIST) aux_source_directory (${PROJECT_SOURCE_DIR}/thread SRC_LIST2)# 添加可执行文件;链接库 add_executable (SmartHome ${SRC_LIST} ${SRC_LIST2}) target_link_libraries (SmartHome /home/xw/pi/libwiringPi.so.2.50 /home/xw/curl-7.71.1/_install/lib/libcurl.so libpthread.so sinput soutput)# 安装,二进制bin 动态库,静态库lib install(TARGETS SmartHome camera quit recording daemonsmarthome sinput soutputRUNTIME DESTINATION ${PROJECT_SOURCE_DIR}/build/binLIBRARY DESTINATION ${PROJECT_SOURCE_DIR}/build/libARCHIVE DESTINATION ${PROJECT_SOURCE_DIR}/build/lib )
- 分文件下的CMakeLists,主要生成动态库文件
# 生成动态库 add_library(sinput SHARED fireSensor.c socketContrl.c)
- 编译时候只需要创建一个build目录
-
通过cmake 来生成makefile,并指定编译器等
cmake .. -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc -
make编译,make install安装
set命令
set
命令可以设置普通变量、缓存条目、环境变量三种变量的值- 可以添加版本号等
- nclude_directories
include_directories命令
将指定目录添加到编译器的头文件搜索路径之下
add_subdirectory命令
用于在当前 CMakeLists.txt 文件中引入另一个子目录的 CMake 构建。这样,可以在一个项目中组织多个子项目或子模块的构建。
aux_source_directory命令
目录下所有源文件,加入到变量,方便后面的编译
add_executable命令
添加可执行文件
target_link_libraries命令
添加所需要的链接库文件
install命令
安装,二进制bin 动态库,静态库lib
install(TARGETS myrun mylibRUNTIME DESTINATION ${PROJECT_SOURCE_DIR}/build/binLIBRARY DESTINATION ${PROJECT_SOURCE_DIR}/build/libARCHIVE DESTINATION ${PROJECT_SOURCE_DIR}/build/lib
)
- 将二进制可执行文件 myrun 安装到目录 ${PROJECT_SOURCE_DIR}/build/bin
- 将动态库文件 mylib 安装到目录 ${PROJECT_SOURCE_DIR}/build/lib
- 将静态库文件 mystaticlib 安装到目录 ${PROJECT_SOURCE_DIR}/build/lib