个人常用
加载静态库
# 指定静态库路径
set(LIB_DIR "path/to/static/library")
# 将源代码添加到此项目的可执行文件。
add_executable (YourExecutableName "your_source_files.cpp")
# 链接静态库
target_link_libraries(YourExecutableName PRIVATE ${LIB_DIR}/libyour_static_library.a)
加载动态库
# 指定动态库路径
set(LIB_DIR "path/to/shared/library")
# 将源代码添加到此项目的可执行文件。
add_executable (YourExecutableName "your_source_files.cpp")
# 链接动态库
target_link_libraries(YourExecutableName PRIVATE ${LIB_DIR}/libyour_shared_library.so)
编译流程
蓝色虚线表示使用makefile构建项目的过程
红色实线表示使用cmake构建项目的过程
CMake的使用
注释
注释行
CMake 使用 # 进行行注释,可以放在任何位置。
注释块
CMake 使用 #[[ ]] 形式进行块注释。
CMakeLists.txt 文件
cmake_minimum_required(VERSION 3.0) #指定使用的 cmake 的最低版本
project(CALC) #定义工程名称
add_executable(app add.c div.c main.c mult.c sub.c) #add_executable(可执行程序名 源文件名称)
执行CMake 命令
$ cmake CMakeLists.txt文件所在路径
定义变量
# set(SRC_LIST add.c div.c main.c mult.c sub.c)
add_executable(app ${SRC_LIST})
指定使用的C++标准
C++标准对应有一宏叫做DCMAKE_CXX_STANDARD
//方式一
$ g++ *.cpp -std=c++11 -o app
//方式二 在 CMakeLists.txt 中通过 set 命令指定
#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)
#增加-std=c++14
set(CMAKE_CXX_STANDARD 14)
#增加-std=c++17
set(CMAKE_CXX_STANDARD 17)
//方式三 在执行 cmake 命令的时候指定出这个宏的值
#增加-std=c++11
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=11
#增加-std=c++14
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=14
#增加-std=c++17
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=17
指定输出的路径
在CMake中指定可执行程序输出的路径,也对应一个宏,叫做EXECUTABLE_OUTPUT_PATH,它的值还是通过set命令进行设置:
set(HOME /home/robin/Linux/Sort) #定义一个变量用于存储一个绝对路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin) #将拼接好的路径值设置给EXECUTABLE_OUTPUT_PATH宏
//如果这个路径中的子目录不存在,会自动生成,无需自己手动创建
由于可执行程序是基于 cmake 命令生成的 makefile 文件然后再执行 make 命令得到的,所以如果此处指定可执行程序生成路径的时候使用的是相对路径 ./xxx/xxx,那么这个路径中的 ./ 对应的就是 makefile 文件所在的那个目录。
搜索文件
在CMake中为我们提供了搜索文件的命令,可以使用aux_source_directory命令或者file命令。
//方式一
//在 CMake 中使用aux_source_directory 命令可以查找某个路径下的所有源文件
aux_source_directory(< dir > < variable >)
dir:要搜索的目录
variable:将从dir目录下搜索到的源文件列表存储到该变量中
//案列
cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${PROJECT_SOURCE_DIR}/include)
# 搜索 src 目录下的源文件
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)
add_executable(app ${SRC_LIST})
//方式二
//除了搜索以外通过 file 还可以做其他事情
file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)
GLOB: 将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中。
GLOB_RECURSE:递归搜索指定目录,将搜索到的满足条件的文件名生成一个列表,并将其存储到变量中。
//搜索当前目录的src目录下所有的源文件,并存储到变量中
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
file(GLOB MAIN_HEAD ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)
CMAKE_CURRENT_SOURCE_DIR 宏表示当前访问的 CMakeLists.txt 文件所在的路径。
包含头文件
在CMake中设置要包含的目录通过include_directories就可以搞定
include_directories(headpath)
//案列
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})
其中,第六行指定就是头文件的路径,PROJECT_SOURCE_DIR宏对应的值就是我们在使用cmake命令时,后面紧跟的目录,一般是工程的根目录。