0%

cmake

cmake


跨平台的安装(编译)工具
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。


单项目构建

基础

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cmake_minimum_required(VERSION 3.3.0)

# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)

project(TESTCMAKE VERSION 1.12.7)
set(TESTCMAKE_SOVERSION ${TESTCMAKE_VERSION})

INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include2)

FILE(GLOB testgroup "./testgroup/src\/*.cpp" "./testgroup/include\/*.h")
source_group(testgroup FILES ${testgroup})
add_executable(TESTCMAKE src/TESTCMAKE.cpp include/TESTCMAKE.h ${testgroup})

模快组织

文件目录结构

头文件和源文件分离

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
option(USE_SOLUTION_FOLDERS "USE_SOLUTION_FOLDERS" ON)
option(GROUP_BY_EXPLORER "GROUP_BY_EXPLORER" OFF)

if (USE_SOLUTION_FOLDERS AND (NOT GROUP_BY_EXPLORER)) # 在 IDE 中对文件进行分组,源文件和头文件分开
foreach(FILE ${allfiles})
# Get the directory of the source file
get_filename_component(PARENT_DIR "${FILE}" DIRECTORY)
MESSAGE( STATUS "this var FILE = ${FILE}.")
# Remove common directory prefix to make the group
string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" GROUP "${PARENT_DIR}")

# Make sure we are using windows slashes
string(REPLACE "/" "\\" GROUP "${GROUP}")
MESSAGE( STATUS "this var GROUP = ${GROUP}.")

# Group into "Source Files" and "Header Files"
if ("${FILE}" MATCHES ".*\\.cpp")
set(GROUP "Source Files${GROUP}")
elseif("${FILE}" MATCHES ".*\\.h")
set(GROUP "Header Files${GROUP}")
endif()
source_group("${GROUP}" FILES "${FILE}")
endforeach()
endif()

add_executable(TESTCMAKEGROUP src/TESTCMAKE.cpp include/TESTCMAKE.h ${allfiles})

头文件和源文件不分离

1
2


多项目依赖

lib库的CMakeLists文件

1
2
3
4
5
6
FILE(GLOB allfiles "./src\/*.cpp" "./include\/*.h")

add_library(lib1 ${allfiles})
target_include_directories(lib1 PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
)

主项目的CmakeLists文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cmake_minimum_required(VERSION 3.3.0)

# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)

project(CMAKELIB VERSION 1.12.7)
set(CMAKELIB_SOVERSION ${CMAKELIB_VERSION})


FILE(GLOB allfiles "./src\/*.cpp" "./include\/*.h")

add_subdirectory(lib1)
list(APPEND EXTRA_LIBS lib1)
list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/lib1/include")


INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
add_executable(CMAKELIB src/cmakemain.cpp include/cmakemain.h ${allfiles})

target_link_libraries(CMAKELIB PUBLIC ${EXTRA_LIBS})
target_include_directories(CMAKELIB PUBLIC
"${PROJECT_BINARY_DIR}"
${EXTRA_INCLUDES}
)

引用库

筛选器

文件夹遍历

DEBUG和RELEASE

cmake .. -DCMAKE_BUILD_TYPE=Debug