Cmake
cmake—高级编译配置工具
将多个cpp、hpp文件组合构建为一个大工程的语言。所有操作都是通过编译CmakeLists.txt完成。
project (HELLO)
set(SRC_LIST main.cpp)
message(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
message(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
add_executable(hello ${SRC_LIST})
Cmake关键字
- project: 用来指定工程的名字和支持的语言
project (HELLO) 指定了工程的名字,并且支持所有语言
- set: 显示指定变量的
set(SRC_LIST main.cpp) #SRC_LIST变量就包含了main.cpp
set(SOURCES
src/Hello.cpp
src/main.cpp
)#创建一个变量,名字叫SOURCE。它包含了所有的cpp文件。
- message :向终端输出用户自定义的信息
信息:
- SEND_ERROR,产生错误,生成过程被跳过
- SATUS,输出前缀为—的信息
- FATAL_ERROR,立即终止所有 cmake 过程
- add_executable: 生成可执行文件
add_executable(hello_code ${SRC_LIST}) #生成的可执行文件名是hello_code,源文件读取变量SRC_LIST中的内容
或 add_executable(hello_code main.cpp)
- target_include_directories: 有其他需要包含的文件夹(文件夹里有头文件)时,可以使用以下命令使编译器知道它们: target_include_directories()。编译此目标时,这将使用-I标志将这些目录添加到编译器中,例如 -I /目录/路径
target_include_directories(hello_code PRIVATE ${PROJECT_SOURCE_DIR}/include)
-
target_link_libraries: 创建将使用这个库的可执行文件时,必须告知编译器需要用到这个库。 可以使用target_link_library()函数完成此操作。add_executable()连接源文件,target_link_libraries()连接库文件。
add_executable(hello_binary src/main.cpp) target_link_libraries(hello_binary PRIVATE hello_library )
将hello_library链接到hello_binary可执行文件上。
- add_subdirectory: 这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
add_subdirectory(src bin)
:将 src 子目录加入工程并指定编译输出(包含编译中间结果)路径为bin 目录
如果不进行 bin 目录的指定,那么编译结果(包括中间结果)都将存放在build/src 目录
每个目录下都要有一个CMakeLists.txt说明
//目录结构
[root@localhost cmake]# tree
.
├── build
├── CMakeLists.txt
└── src
├── CMakeLists.txt
└── main.cpp
//外层CMakeLists.txt
project(HELLO)
add_subdirectory(src bin)
//src下的CMakeLists.txt
add_executable(hello main.cpp)
更改二进制的保存路径
set 指令重新定义 EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 变量 来指定最终的目标二进制的位置
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
cmake指定的变量
变量 | 说明 |
---|---|
CMAKE_SOURCE_DIR | 根目录,工程顶层目录。一般认为是PROJECT_SOURCE_DIR |
CMAKE_CURRENT_SOURCE_DIR | 处理CmakeLists.txt所在的路径 |
PROJECT_SOURCE_DIR | 工程顶层目录 |
CMAKE_BINARY_DIR | 运行cmake的目录。外部构建就是build目录 |
CMAKE_CURRENT_BINARY_DIR | 当前所在的build目录 |
PROJECT_BINARY_DIR | 一般认为是CMAKE_BINARY_DIR |
Cmake语法
- 基本原则
- 变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名
- 指令(参数 1 参数 2…) 参数使用括弧括起,参数之间使用空格或分号分开。 以上面的 add_executable 指令为例,如果存在另外一个 func.cpp 源文件
add_executable(hello main.cpp func.cpp)
或者add_executable(hello main.cpp;func.cpp)
- 指令是大小写无关的,参数和变量是大小写相关的
-
set(SRC_LIST main.cpp) 可以写成 set(SRC_LIST “main.cpp”),如果源文件名中含有空格,就必须要加双引号。
add_executable(hello main) 后缀可以不写,他会自动去找.c和.cpp,最好不要这样写,可能会有这两个文件main.cpp和main