一.指定cmake版本cmake_minimum_required()
cmake_minimum_required(VERSION 2.6)
二.指定项目名字project()
project(softsz_edge_detect)
三.头文件
include_directories( ${PROJECT_SOURCE_DIR}/../inc_meg )
四.源文件
4.1单个
aux_source_directory(< dir > < variable >)
4.2多个源文件
4.2.1.aux_source_directory()
dir:要搜索的目录
variable:将从dir目录下搜索到的源文件列表存储到该变量中
aux_source_directory(${PROJECT_SOURCE_DIR} SRC_DIR)
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_DIR)
4.2.2.file()
file(GLOB/GLOB_RECURSE CPP_SOURCES ${PROJECT_SOURCE_DIR}/rc/*.cpp)
GLOB: 将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中。
GLOB_RECURSE:递归搜索指定目录,将搜索到的满足条件的文件名生成一个列表,并将其存储到变量中。
五.生成链接库
需要*.cpp + .h
5.1静态add_library( 1 static 2 )
add_library(库名称 STATIC 源文件1 [源文件2] ...)
多个文件
file(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) ###静态库指定生成路径
add_library(calc STATIC ${SRC_LIST})
5.2动态add_library( 1 SHARED 2 )
add_library(库名称 SHARED 源文件1 [源文件2] ...)
add_library(demo SHARED ${SRC_DIR})
多个源文件
cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) ###设置动态库生成路径
add_library(calc SHARED ${SRC_LIST})
六.生成可执行文件
6.1可指定输出目录
set(HOME /home/robin/Linux/Sort)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)
6.2生成可执行文件
cmake_minimum_required(VERSION 3.0)
project(CALC)
set(CMAKE_CXX_STANDARD 11)
set(HOME /home/robin/Linux/calc)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin/)
include_directories(${PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
add_executable(app ${SRC_LIST})
七.链接库文件到可执行文件
静态库动态库区别:静态库在连接到可执行文件后 会把静态库文件和源文件都打包到可执行文件
动态库在程序启动后,调用到动态库程序中的程序时动态库才加载到内存中
静态库通常较大,需要发布较小的则生成动态库 。
需要main.cpp + .h +lib
7.1链接静态库
单个
link_directories(<lib path>) ####指定库的搜索路径
link_librarie( static <lib> ) ----链接库
多个
link_libraries( static <lib> <lib> <lib> )
link_directories( <lib path> <.so path> <.a path>) ---指定路径自带的需要制定路径
cmake_minimum_required(VERSION 3.0)
project(CALC)
# 搜索指定目录下源文件
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
# 包含头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
# 包含静态库路径
link_directories(${PROJECT_SOURCE_DIR}/lib)
# 链接静态库
link_libraries(calc)
add_executable(app ${SRC_LIST})
通过链接库调试文件时只需要 链接库与头文件+测试文件 (其中链接库相当于二进制源代码)
7.2链接动态库
target_link_libraries(
<target>
<PRIVATE|PUBLIC|INTERFACE> <item>...
[<PRIVATE|PUBLIC|INTERFACE> <item>...]...)
cmake_minimum_required(VERSION 3.0)
project(TEST)
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
# 指定源文件或者动态库对应的头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
# 指定要链接的动态库的路径
link_directories(${PROJECT_SOURCE_DIR}/lib) 指定库路径
# 添加并生成一个可执行程序
add_executable(app ${SRC_LIST})
# 指定要链接的动态库 必须写在最后一行
target_link_libraries(app pthread calc) 第三方的库 和系统库
八 追加、移除、宏定义
用于调试debug时
cmake_minimum_required(VERSION 3.0)
project(TEST)
set(TEMP "hello,world")
file(GLOB SRC_1 ${PROJECT_SOURCE_DIR}/src1/*.cpp)
file(GLOB SRC_2 ${PROJECT_SOURCE_DIR}/src2/*.cpp)
# 追加(拼接)
set(SRC_1 ${SRC_1} ${SRC_2} ${TEMP})
message(STATUS "message: ${SRC_1}")
cmake_minimum_required(VERSION 3.0)
project(TEST)
set(TEMP "hello,world")
file(GLOB SRC_1 ${PROJECT_SOURCE_DIR}/*.cpp)
# 移除前日志
message(STATUS "message: ${SRC_1}")
# 移除 main.cpp
list(REMOVE_ITEM SRC_1 ${PROJECT_SOURCE_DIR}/main.cpp)
# 移除后日志
message(STATUS "message: ${SRC_1}")
#include <stdio.h>
#define NUMBER 3
int main()
{
int a = 10;
#ifdef DEBUG
printf("我是一个程序猿, 我不会爬树...\n");
#endif
for(int i=0; i<NUMBER; ++i)
{
printf("hello, GCC!!!\n");
}
return 0;
}
cmake_minimum_required(VERSION 3.0)
project(TEST)
# 自定义 DEBUG 宏
add_definitions(-DDEBUG)
add_executable(app ./test.c)
常用宏
PROJECT_SOURCE_DIR 使用cmake命令后紧跟的目录,一般是工程的根目录
PROJECT_BINARY_DIR 执行cmake命令的目录
CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_BINARY_DIR target 编译目录
EXECUTABLE_OUTPUT_PATH 重新定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH 重新定义目标链接库文件的存放位置
PROJECT_NAME 返回通过PROJECT指令定义的项目名称
CMAKE_BINARY_DIR 项目实际构建路径,假设在build目录进行的构建,
那么得到的就是这个目录的路径
九、嵌套的CMake
根目录下添加子节点路径
# 添加子目录
add_subdirectory(calc)
add_subdirectory(sort)
add_subdirectory(test1)
add_subdirectory(test2)
子节点 搜索路径时 使用 ./
cmake_minimum_required(VERSION 3.0)
project(CALCLIB)
aux_source_directory(./ SRC)
include_directories(${HEAD_PATH})
set(LIBRARY_OUTPUT_PATH ${LIB_PATH})
add_library(${CALC_LIB} STATIC ${SRC})
条件判断循环..............
学习爱编程的大丙记录如上
作者: 苏丙榅
链接: https://subingwen.cn/cmake/CMake-primer/