CMakeLists入门

Aug 20, 2021

cmake入门

我的学习背景: 使用xcode开发OpenGL,在链完教程中的路径之后,项目可以学习起来了,但是链接过程不知道原因。
之前的学习刚好有打包动态、静态库,链接过程清晰。但是这会却不明了。

打算自己做cmake链接,以下是做记录:

当前环境:

brew 安装glew、glfw,需要使用CMake进行库的链接。

直接开始代码上的讲解:

链接库制作

1
2
3
4
5
6
7
8
# 将当前所有文件名列为数组保存
aux_source_directory(. DIR_LIB_SRCS)
# 指明制作library
add_library(MathFunctions ${DIR_LIB_SRCS})
# 当执行make install时,执行下面操作
# 保存头文件至includes;保存lib文件至 /usr/local/lib
install(TARGETS MathFunctions DESTINATIONS lib)
install(FILES MathFunctions DESTINATIONS includes)

主库制作

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# CMake最低版本要求
cmake_minimum_required(VERSION 2.8)
# 项目信息
project(Learngl)
# 设置环境变量 set(key value)
set(Learngl_VERSION_MAJOR 1)
set(Learngl_VERSION_MINOR 0)
# 查看是否有有环境变量,否则初始设置为ON
option(USE_MUMATH "use provided math implementation" ON)
# 将当前所有环境变量等进行configfile,将config.h.in 转为config.h
# ${PROJECT_SOURCE_DIR} 指项目中源文件
# ${PROJECT_BINARY_DIR} 指项目中目标生成文件
configure_file(
"${PROJECT_SOURCE_DIR}/config.h.in"
"${PROJECT_BINARY_DIR}/config.h"
)
if (NOT HAVE_POW)
# 引入头文件搜索路径
include_directories("${PROJECT_SOURCE_DIR}/math")
# 加入该子模块,显示执行子模块CMakeLists.txt
add_subdirectory(math)
set(EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (NOT HAVE_POW)

# 将当前所有项目文件(.* 文件) 转入
aux_source_directory(. DIR_SRCS)
# 生成执行文件Learngl,文件为${DIR_SRCS}内容
add_executable(Learngl ${DIR_SRCS})
target_link_libraries(Learngl ${EXTRA_LIBS})
# 导入glfw lib
# 链接lib路径
link_directories("/usr/local/Cellar/glfw/3.3.4/lib")
# 使用lib/libglfw.[dylib|a]文件
target_link_libraries(Learngl glfw)

# 生成macro,macro(${名称} ${参数1} ${参数2} ${参数3})
macro (do_test arg1 arg2 result)
# add_test 是执行测试用例,make test执行
add_test(test_${arg1}_${arg2} Learngl ${arg1} ${arg2})
# 设置单元测试用例的判别,使用正则来判断是否符合相应数据
set_tests_properties(test_${arg1}_${arg2} PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro (do_test)

# 测试执行单元测试用例(也可以直接add_test 使用)
do_test(5 2 "is 25")
do_test(10 5 "is 100000")

参考
示例demo