[TOC]

cmake基本结构

首先一般先声明Cmake版本要求、项目名称、编译标志:

1
2
3
4
5
cmake_minimum_required (VERSION 3.x)

project (XXXXXXX)

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -std=c++14")

定义宏

1
2
3
4
add_definitions(-DPRE_DEBUG=1)
#或add_compile_definitions(PRE_DEBUG=1)
#相当于C++中:
#define PRE_DEBUG 1

设置源码目录:

1
2
set (source_dir "${PROJECT_SOURCE_DIR}/src/")
#${PROJECT_SOURCE_DIR}为CMakeLists.txt所在文件夹位置

可选配置(变量代替所有文件):

1
2
file (GLOB source_files "${source_dir}/*.cpp")
#${source_dir}为上文设置的源码目录;${}为取值操作;*为通配符;*.cpp所有cpp文件

生成可执行文件:

1
2
3
add_executable (HelloWorld ${source_files})
#${source_files}为上文设置的汇总源文件
#所有文件都要编译(生成.o二进制文件),最终链接Link生成名为HelloWorld的可执行文件

链接库文件:

1
2
target_link_libraries(HelloWorld -lpthread)
#链接lpthread多线程等库文件(不用-时会自动加上-l)

生成库文件:

1
2
add_library(funcLib_shared SHARED SRC_LIST)#库的名称funcLib_shared,库的类型,库的源文件(动态库)
add_library(funcLib_static STATIC SRC_LIST)#库的名称funcLib_static,库的类型,库的源文件(静态库)

多文件工程编译

除了设置源文件目录,还需设置头文件以及库文件目录。

设置头文件目录:

1
2
3
4
5
6
include_directories("${PROJECT_SOURCE_DIR}/include")    #三种方式都可,建议不用“”
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${PROJECT_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/include)
#${PROJECT_SOURCE_DIR}、${CMAKE_SOURCE_DIR}都是CMakeLists.txt文件所在位置,文件夹需要自己建
#类似于makefile的-I

设置库文件目录:

1
2
3
4
5
6
link_directories("${PROJECT_SOURCE_DIR}/lib")
link_directories(${CMAKE_SOURCE_DIR}/lib)
link_directories(${PROJECT_SOURCE_DIR}/library
${PROJECT_SOURCE_DIR}/archive)
#${PROJECT_SOURCE_DIR}、${CMAKE_SOURCE_DIR}都是CMakeLists.txt文件所在位置,文件夹需要自己建
#类似于makefile的-L #-l(小写L)是引相应库文件,L(大写L)是库文件所在目录

输出路径设置

  1. CMAKE_ARCHIVE_OUTPUT_DIRECTORY:默认存放静态库的文件夹位置;
  2. CMAKE_LIBRARY_OUTPUT_DIRECTORY:默认存放动态库的文件夹位置;
  3. LIBRARY_OUTPUT_PATH:默认存放库文件的位置,如果产生的是静态库并且没有指定 CMAKE_ARCHIVE_OUTPUT_DIRECTORY 则存放在该目录下,动态库也类似;
  4. CMAKE_RUNTIME_OUTPUT_DIRECTORY:存放可执行软件的目录;
1
2
3
4
5
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/archive)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/library)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/runtime)
set(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/path)
#CMAKE_SOURCE_DIR即CMakeLists.txt文件所在位置,所有文件夹会自动创建

添加子目录

1
2
add_subdirectory (${PROJECT_SOURCE_DIR}/lib_func)
#子目录下的CMakeLists.txt也会被执行