cmake
1、从一个项目目录说起
.
├── bin
├── build
├── CMakeLists.txt
├── include
│ ├── testFunc1.h
│ └── testFunc.h
└── src
├── main.c
├── testFunc1.c
└── testFunc.c
我们不必关心目录中的文件的功能,我们只看看CMakeLists.txt中的内容.
cmake_minimum_required (VERSION 2.8) # 设置运行本项目所需要的cmake最小版本号
project (demo) # 设置项目名称
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) # 设置可执行文件的输出目录
aux_source_directory (src SRC_LIST) # 设置STC_LIST变量为src目录下所有文件
include_directories (include) #设置指定包含头文件的目录
add_executable (main ${SRC_LIST}) # 最终可执行文件的名字main.ext,依赖的所有文件
2、cmake其他命令
add_subdirectory (src)
,这个命令可以向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制的存放位置,具体用法可以百度。
这里指定src目录下存放了源文件,当执行cmake时,就会进入src目录下去找src目录下的CMakeLists.txt,所以在src目录下也建立一个CMakeLists.txt,内容如下,
add_library (testFunc_shared SHARED ${SRC_LIST})
生成动态库或静态库(第1个参数指定库的名字;第2个参数决定是动态还是静态,如果没有就默认静态;第3个参数指定生成库的源文件)
set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
指定库文件输出路径
option(MYDEBUG "enable debug compilation" OFF)
其第一个参数是这个option的名字,第二个参数是字符串,用来描述这个option是来干嘛的,第三个是option的值,ON或OFF,也可以不写,不写就是默认OFF。
add_compile_options(-std=c++11 -Wall)
添加编译选项
set(SRC main.c test.c xx.c xxx.c)
设置变量SRC为后面指定的文件
find_library(TESTFUNC_LIB testFunc HINTS ${PROJECT_SOURCE_DIR}/testFunc/lib)
在指定目录下查找指定库,并把库的绝对路径存放到变量里,其第一个参数是变量名称,第二个参数是库名称,第三个参数是HINTS,第4个参数是路径,其它用法可以参考cmake文档
target_link_libraries (main ${TESTFUNC_LIB})
把目标文件与库文件进行链接
3、实际项目的一个CMakeLists.txt
![image.png](https://s2.loli.net/2022/06/05/9BWROAGmeihdKyv.png)
cmake_minimum_required (VERSION 3.0)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
add_compile_options(-std=c++11)
set(SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/XThreadPool.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/XThread.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/XServerTask.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/XComTask.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/XTools.cpp)
project (demo)
FIND_LIBRARY(Libevent libevent.dylib /opt/homebrew/Cellar/libevent/2.1.12/lib/)
add_library (xcom SHARED ${SRC_LIST})
target_link_libraries (xcom ${Libevent})