以下是本人在学习Cmake的一些笔记,各位大佬不要笑话。
#单个文件时
CMAKE_MINIMUM_REQUIRED(VERSION 3.10) #CMake版本
PROJECT(dome1) #工程名
ADD_EXECUTABLE(dome1 src.cpp) #1.可执行文件名,2.源文件
#*************************************************************************#
#多个文件时
CMAKE_MINIMUM_REQUIRED(VERSION 3.10) #CMake版本
PROJECT(dome2) #工程名
#笨方法
ADD_EXECUTABLE(dome2 src1.cpp src2.cpp) #1.可执行文件名,2.源文件
#高效方法
AUX_SOURCE_DIRECTORY(./ DIR_SRC) #将目录下的所有文件放在变量中
ADD_EXECUTABLE(dome2 ${DIR_SRC}) #${}是变量的使用方法
#*************************************************************************#
#多个文件,多个目录时,在每一级目录里面都要有一个CMakeLists.txt逐级往上
#子目录里面的CMakeLists.txt
AUX_SOURCE_DIRECTORY(./ DIR_SRC) #将目录下的所有文件放在变量中
ADD_LIBRARY(Mylib STATIC ${DIR_SRC}) #1.静态库名,相当于将该目录打包成一个静态库
ADD_LIBRARY(Mylib SHARED ${DIR_SRC}) #1.动态库名,相当于将该目录打包成一个动态库
#主目录里面的CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.10) #CMake版本
PROJECT(dome3) #工程名
ADD_SUBDIRECTORY(./mylib) #假设mylib是一个子目录,添加即可
AUX_SOURCE_DIRECTORY(./ DIR_SRC) #将目录下的所有文件放在变量中
ADD_EXECUTABLE(dome3 ${DIR_SRC}) #${}是变量的使用方法
#链接共享库
TARGET_LINK_LIBRARIES(dome3 Mylib) #1.可执行文件名,2.共享库名不包括后缀
#*************************************************************************#
#同级多目录工程,bulid,mylib,src三个目录分别存放文件
#1.src文件下CMakeLists.txt的编写方式
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/mylib) #多个路径之间用空格隔开
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) #设置输出可执行文件的路径
AUX_SOURCE_DIRECTORY(./ DIR_SRC) #将目录下的所有文件放在变量中
ADD_EXECUTABLE(dome4 ${DIR_SRC}) #${}是变量的使用方法
#链接共享库
TARGET_LINK_LIBRARIES(dome4 Mylib) #1.可执行文件名,2.共享库名不包括后缀
#mylib目录里面的CMakeLists.txt
AUX_SOURCE_DIRECTORY(./ DIR_SRC) #将目录下的所有文件放在变量中
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) #设置库文件的输出路径
ADD_LIBRARY(Mylib STATIC ${DIR_SRC}) #1.静态库名,相当于将该目录打包成一个静态库
ADD_LIBRARY(Mylib SHARED ${DIR_SRC}) #1.动态库名,相当于将该目录打包成一个动态库
#顶级目录里面的CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.10) #CMake版本
PROJECT(dome3) #工程名
ADD_SUBDIRECTORY(./mylib) #假设mylib是一个子目录,添加即可
ADD_SUBDIRECTORY(./src) #假设mylib是一个子目录,添加即可
#最后在build文件夹中编译使用 cmake .. 表示主CMakeLists.txt文件在上一级目录,然后make即可
#*************************************************************************#
#条件编译,在编译时加如宏定义
#需要先定义 ./config/config.hpp.in
#然后在./src/CMakeLists.txt 书写如下
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) #设置输出可执行文件的路径
CONFIGURE_FILE(
"${PROJECT_SOURCE_DIR}/config/config.hpp.in" #输入文件
"${PROJECT_SOURCE_DIR}/config/config.hpp" #输出文件
)
OPTION( #初始化 USE_MYMATH 宏为ON(打开)
USE_MYMATH
ON
)
IF(USE_MYMATH) #当 USE_MYMATH 打开的时候执行以下内容
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/mylib) #多个路径之间用空格隔开
ENDIF(USE_MYMATH)
AUX_SOURCE_DIRECTORY(./ DIR_SRC) #将目录下的所有文件放在变量中
ADD_EXECUTABLE(dome5 ${DIR_SRC}) #${}是变量的使用方法
#链接共享库
TARGET_LINK_LIBRARIES(dome5 Mylib) #1.可执行文件名,2.共享库名不包括后缀
#然后就是编写config/config.hpp.in文件
#写"#cmakedefine USE_MYMATH" 后面是你在程序中定义的宏,可以在 ccmake .. 交互界面设置该宏是否被打开
在VScode环境下使用Cmake,调试
#顶级目录里面的CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.10) #CMake版本
PROJECT(dome3) #工程名
add_definitions(-std=c++11)
#调试命令
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -00 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -03 -Wall")
ADD_SUBDIRECTORY(./mylib) #假设mylib是一个子目录,添加即可
ADD_SUBDIRECTORY(./src) #假设mylib是一个子目录,添加即可