cmake常用命令

基本用法

#设置cmake最低版本
cmake_minimum_required(VERSION 3.25) 
#指定项目名,一般是根目录名
project(cplus)
#根据main.cpp 生成可执行文件hello
add_executable(hello main.cpp)

构建、编译 、安装

#生成MakeFile相关文件
cmake ..
#编译
make
#安装
sudo make install

常用指令

set(自定义变量)
# 定义变量
set(A_VAR a.cpp)
set(A_VAR “a .cpp”) # 包含空格时候必须使用双引号
# 使用变量${}
add_executable(a ${A_VAR})
message("source dir:" ${PROJECT_SOURCE_DIR})
内置变量
# 使用变量${}
PROJECT_SOURCE_DIR #项目源文件【/home/jeff/Desktop/cplus】
PROJECT_BINARY_DIR #二进制文件【/home/jeff/Desktop/cplus/build】
message(cmake命令输出信息)
  • STATUS 输出前缀 –
  • SEND_ERROR 产生错误,生成过程被跳过
  • FATAL_ERROR 立即终止所有 cmake 过程
# 项目名一般是项目根文件夹名称
message("source dir:" ${PROJECT_SOURCE_DIR})
message(STATUS "source dir:" ${PROJECT_SOURCE_DIR})
message(SEND_ERROR "source dir:" ${PROJECT_SOURCE_DIR})
message(FATAL_ERROR "source dir:" ${PROJECT_SOURCE_DIR})
add_subdirectory(多级目录编译)
#root路径
cplus
├── build
├── CMakeLists.txt
└── src
    ├── CMakeLists.txt
    └── eigen_main.cpp
# src子级路径、编译到build/bin目录下 
add_subdirectory(src bin)
install(安装)
  • FILES 文件
  • PROGRAMS 非目标文件的可执行程序安装(比如脚本之类)
  • DIRECTORY 拷贝
#1、CMAKE_INSTALL_PREFIX  相对路径默认是在 /usr/local/
#2、使用绝对路径
#3、cmake -DCMAKE_INSTALL_PREFIX=/usr    在cmake的时候指定
install(FILES xxx DESTINATION /jeff/local)
install(PROGRAMS xxx DESTINATION /jeff/bin)
install(DIRECTORY xxx DESTINATION /jeff/doc)

静态库与动态库

编译
SET(A_SRC a.cpp)

ADD_LIBRARY(a_static STATIC ${A_SRC})
#对a_static的重名为a,
SET_TARGET_PROPERTIES(a_static PROPERTIES  OUTPUT_NAME "a")
#动态库与静态库同名时候需要添加,防止构建时候被删除
SET_TARGET_PROPERTIES(a_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)

ADD_LIBRARY(a SHARED ${A_SRC})
SET_TARGET_PROPERTIES(a PROPERTIES  OUTPUT_NAME "a")
SET_TARGET_PROPERTIES(a PROPERTIES CLEAN_DIRECT_OUTPUT 1)
安装共享库和头文件
#文件放到该目录下
INSTALL(FILES a.h DESTINATION include/a)
#二进制,静态库,动态库安装都用TARGETS
#ARCHIVE 特指静态库,LIBRARY 特指动态库,RUNTIME 特指可执行目标二进制。
INSTALL(TARGETS a a_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
# cmake时候指定系统目录
`cmake -D CMAKE_INSTALL_PREFIX=/usr ..`
引用
  • 动静态库应该放在add_executable指令之后
#1、CMakeLists.txt 添加
INCLUDE_DIRECTORIES(/usr/include/a)
#2、LINK_DIRECTORIES     添加非标准的共享库搜索路径
LINK_DIRECTORIES(/jeff/cplus/libs)
#3、TARGET_LINK_LIBRARIES    添加需要链接的共享库,hello为add_executable的可执行文件
TARGET_LINK_LIBRARIES(hello liba.a) 

你可能感兴趣的:(机器人之旅,linux,运维,cmake)