cmake
Nevermore 2024-08-01
# 1.Ubuntu源码安装cmake
cmake -S . -B build #-G "Ninja" 指定编译工具
cmake --build build
cmake --install build
1
2
3
2
3
- 安装编译工具
sudo apt install g++ make ninja-build unzip libssl-dev
1
- 准备cmake源码
wget https://github.com/Kitware/CMake/releases/download/v3.30.2/cmake-3.30.2.tar.gz
1
tar -xvf cmake-3.30.2.tar.gz
1
cd cmake
1
./configure
1
make -j32
1
- 安装:sudo make install
- 添加环境变量
vim ~/.bash_profile
export PATH=/usr/local/share/cmake-3.30:$PATH
1
2
3
2
3
- cmake --version
# 2.CMakeLists.txt
- 编译静态库
# 指定cmake最低版本
cmake_minimum_required(VERSION 3.15)
#构建的项目名称和版本
project(test VERSION 0.1 LANGUAGES CXX)
#若编译不指定.h,需要添加头文件路径
include_directories("include_Path")
#编译为静态库
add_library(${PROJECT_NAME} STATIC a.cpp a.h)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- 链接静态库
# 指定cmake最低版本
cmake_minimum_required(VERSION 3.15)
#构建的项目名称和版本
project(test VERSION 0.1 LANGUAGES CXX)
#指定头文件路径
include_directories("include_Path")
#指定库查找路径
link_directories("lib_Path")
#增加执行程序
add_executable(${PROJECT_NAME}
MANUAL_FINALIZATION
${PROJECT_SOURCES} test.cpp
)
#指定静态库路径, 放在后面,库名称去除前面的lib和后缀
target_link_libraries(${PROJECT_SOURCES} libname)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- 编译动态库——将静态库的STATIC改成SHARED
add_library(${PROJECT_NAME} SHARED a.cpp a.h)
1
- 动态库的编译和使用放到一个CmakeList下
cmake_minimum_required(VERSION 3.15)
project(test)
include_directories("include_Path")
add_library(test SHARED test.cpp) # 编译用
add_executable(${PROJECT_NAME} test.cpp)
target_link_libraries(${PROJECT_SOURCES} libname)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- windows头文件需增加:
- 在windows导出和使用动态库的时候,需要在库类前加__declspec(dllexport),这样才能导出到lib中
- 如果该类库被使用需要使用__declspec(dllimport),可以使用宏对两种情况进行区分
#ifndef _WIN32 #define XCPP_API // mac 和 linux 定义为空 #else #ifdef test_EXPORTS // cmake 自动生成的宏 #define XCPP_API __declspec(dllexport) //给库调用 #else #define XCPP_API __declspec(dllimport) //项目库调用 #endif #endif
1
2
3
4
5
6
7
8
9
# 3.常用语法
- 注释
#[[
xxx
]]
1
2
3
2
3
- 打印信息
message("Para1" "p2" p3 test) #结果无空格
1
- message日志级别
message([
] "message txt") --log-level = <ERROR|WARNING|NOTICE|STATUS|VERBOSE|DEBUG|TRACE>
日志级别 | 日志级别 | ||
---|---|---|---|
① FATAL_ERROR | 停止cmake运行和生成,可以用来解决之前的报错 stderr | ⑤ STATUS | 项目用户感兴趣信息 |
② SEND_ERROR | cmake继续运行,生成跳过 stderr | ⑥ VERBOSE | 项目用户详细信息 |
③ WARNING | stderr | ⑦ DEBUG | 项目本身开发人员使用信息 |
④(none)NOTICE | stderr | ⑧ TRACE | 非常低级实现细节的细粒度消息 |
- if()
- 真:ON,YES,TRUE,Y或非零数(包括浮点数),非假值常量
- 假:OFF,ON,FALSE,N,IGNORE,NOTFOUND,空字符串,或以-NOTFOUND为结尾,环境变量,未定义和其他变量
- 宏不是变量
- 字符串的值是ON,YES等为真,其他带引号的字符串都为假
if(<condition>) elseif(<condition>) else() endif()
1
2
3
4
- 逻辑操作符
if(Not <con>) if(<con1> ANd (con2)) if(<con1> OR (con2)) if(<con1> AND (<con2> OR <con3>))
1
2
3
4
- 一元判断
EXISTS COMMAND DEFINED set(VAR_NEW ON) if(DEFINED VAR_NEW)
1
2
3
4
5
6
- 二元判断
EQUAL,LESS,LESS_EQUAL,GREATER,GREATER_EQUAL STREQUAL,STRLESS,STRLESS_EQUAL,STRGREATER,STRGREATER_EQUAL VERSION_EQUAL,VERSION_LESS,VERSION_LESS_EQUAL,VERSION_GREATER,VERSION_GREATER_EQUAL MATCHES if(<var|str> MATCHES regex)
1
2
3
4
5
6
- 缓存变量cmake_cache
set(<variable> <value> ... CACHE <type> <docstring> [FORCE])
1
type: BOOL | FILEPATH 文件选择 |PATH 目录选择 | STRING 字符串 | INTERNAL 内部变量
docstring: 变量说明
FORCE:强制修改缓存,不设置第二次调用值不变
//注释掉后仍可以打印出内容
使用ccmake build修改cache
cmake -S . -B build -D VAR1="hello" //编译时传递变量
cmake_minimum_required(VERSION 3.20)
project(cmake_cache)
# 设置缓存变量(全局的)
set(VAR1 "Cache var" CACHE STRING "cache doc")
1
2
3
4
2
3
4
- set_property \ get_property
set_property(<GLOBAL | DIRECTORY [<dir>] | TARGET [<target1> ...] | SOURCE [<src1> ...] [DIRECTORY <dirs> ...] [TARGET_DIRECTORY <targets> ...] | INSTALL [<file1> ...] | TEST [<test1> ...] | CACHE [<entry1> ...] > [APPEND] [APPEND_STRING] PROPERTY <name> [<value1> ...]) get_property(<variable> <GLOBAL | DIRECTORY [<dir>] | TARGET <target> | SOURCE <source> [DIRECTORY <dir> | TARGET_DIRECTORY <target>] | INSTALL <file> | TEST <test> | CACHE <entry> | VARIABLE > PROPERTY <name> [SET | DEFINED | BRIEF_DOCS | FULL_DOCS]) define_property(<GLOBAL | DIRECTORY | TARGET | SOURCE | TEST | VARIABLE | CACHED_VARIABLE> PROPERTY <name> [INHERITED] [BRIEF_DOCS <brief-doc> [docs...] ] [FULL_DOCS <full-doc> [docs...] ] [INITIALIZE_FROM_VARIABLE <variable>])
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
31set_property(GLOBAL PROPERTY test_global "hello") get_property(val GLOBAL PROPERTY test_global) define_property(GLOBAL PROPERTY test_define BRIEF_DOCS "define docs") get_property(val GLOBAL PROPERTY test_define DEFINED) get_property(val GLOBAL PROPERTY test_define BRIEF_DOCS) # 目录属性 set_property(DIRECTORY . PROPERTY dirName "my_dir") get_property(var DIRECTORY .[[file path]] PROPERTY dirName) #文件属性 set_property(SOURCE main.cpp PROPERTY S1 "s1 value") get_property(var SOURCE main.cpp PROPERTY S1) # cmake传递变量给c++ # cmake 预置属性 COMPILE_DEFINITIONS 传递预处理变量(宏变量) -DPARA1 1234 set_property(SOURCE main.cpp PROPERTY COMPILE_DEFINITIONS "PARA1=1234") add_executable(${PROJECT_NAME} main.cpp) # cmake 目标属性 set_property(TARGET ${PROJECT_NAME} PROPERTY nvar "var") #c++ 传递宏 set_property(TARGET ${PROJECT_NAME} PROPERTY COMPILE_DEFINITIONS "PARA=\"1234\"") # 属性打印 include(CMakePrintHelpers) cmake_print_properties(TARGETS ${PROJECT_NAME})
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
- 环境变量
cmake_minimum_required(VERSION 3.22)
project(cmake_env)
#环境变量使用 全局无缓存变量
#自定义环境变量
set(ENV{MYENV} "test env value")
message("MYENV = $ENV{MYENV}")
add_subdirectory(sub1)
message("SUB_ENV = $ENV{SUB_ENV}")
#系统环境变量
message("USER NAME = $ENV{USER}")
message("PATH = $ENV{PATH}")
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- cmake 计算Math
#[[
math(EXPR <variable> "<expression>" [OUTPUT_FORMAT <format>])
"5 * (10 + 13)". 支持 +, -, *, /, %, |, &, ^, ~, <<, >>
结果必须是64位有符号整数
输出格式
HEXADECIMAL
0x
0x3e8
DECIMAL
十进制数
]]
cmake_minimum_required(VERSION 3.22)
project(cmake_math)
set(exp "(3*10) + 5")
math(EXPR out ${exp})
message("${exp} = ${out}") # (3*10) + 5 = 35
math(EXPR out ${exp} OUTPUT_FORMAT DECIMAL) #十进制
message("${exp} = ${out}") #(3*10) + 5 = 35
math(EXPR out ${exp} OUTPUT_FORMAT HEXADECIMAL) #十六进制 0x
message("${exp} = ${out}") # (3*10) + 5 = 0x23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 字符串
cmake_minimum_required(VERSION 3.22)
project(cmake_string)
# 取出begin 和end之间的内容test cmake string
set(STR1 " begin test cmake string end ")
# 查找的开头字符串
set(BSTR "begin")
#在${STR1}中 查找${BSTR}的位置存入b
# cmake位置以0开始
string(FIND ${STR1} ${BSTR} b)
string(FIND ${STR1} "end" e)
#去掉begin字符位置
#获取字符串长度
string(LENGTH ${BSTR} size)
math(EXPR b "${b} + ${size}")
# e等于开始到结束的长度
math(EXPR length "${e} - ${b}")
#获取字串 在${STR1字符串${b}位置取${length}长度字符串写入substr
string(SUBSTRING ${STR1} ${b} ${length} substr)
#去掉头尾 空格 \t \n \r
string(STRIP ${substr} substr)
#转成大写 test cmake string
string(TOUPPER ${substr} substr)
#字符串追加 TEST CMAKE STRING
string(APPEND substr " append01 " " append02 ")
#字符串替换 STRINGappend01append02
# string(REPLACE <match-string> <replace-string> <out-var> <input>...)
string(REPLACE "append" "REPLACE" substr ${substr})
#TEST CMAKE STRINGREPLACE01REPLACE02
#正则表达式匹配
string(REGEX MATCH "[A-Z]+[0-9]+" output ${substr})
#[[
string JSON
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
{GET | TYPE | LENGTH | REMOVE}
<json-string> <member|index> [<member|index> ...])
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
MEMBER <json-string>
[<member|index> ...] <index>)
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
SET <json-string>
<member|index> [<member|index> ...] <value>)
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
EQUAL <json-string1> <json-string2>)
]]
#测试用json
# json对象 {} json 数组 []
# 格式 key:value
set( tjson
[=[
{
"webs":{
"web":[
{
"name":"cmake",
"url":"cmake.org.cn"
},{
"name":"ffmpeg",
"url":"ffmpeg.club"
}
,{
"name":"tt",
"url":"tt.club"
}
]
}
}
]=]
)
message(${tjson})
#[[
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
GET <json-string> <member|index> [<member|index> ...])
]]
# 访问webs->web[0]->name
string(JSON var ERROR_VARIABLE evar
GET ${tjson} webs web 0 name
)
if(evar)
message(${evar})
endif()
string(JSON var ERROR_VARIABLE evar
GET ${tjson} webs web 1 url
)
string(JSON var ERROR_VARIABLE evar
GET ${tjson} webs web2 url
)
if(${var})
message("webs web2 = ${var}")
else()
message("NOTFOUND")
endif()
message("evar = ${evar}")
#读取json数组长度
#[[
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
LENGTH <json-string> [<member|index> ...])
]]
string(JSON web_count ERROR_VARIABLE evar
LENGTH ${tjson} webs web
)
message("JSON LENGTH = ${web_count}")
#json的增加和修改
#[[
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
SET <json-string> <member|index> [<member|index> ...] <value>)
value必须是json
]]
#json的增加
string(JSON set_out SET ${tjson} webs web ${web_count} [=[{
"name":"cpp",
"url":"cppds.com"
}]=])
message("set_out = ${set_out}")
#json的修改 SET
string(JSON set_out2 SET ${set_out} webs web 1 [=[{
"name":"ffmpeg2",
"url":"ffmpeg.club"
}]=])
message("set_out2 = ${set_out2}")
#json的删除 REMOVE
#[[
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
REMOVE <json-string> <member|index> [<member|index> ...])
]]
string(JSON remove_out REMOVE ${set_out2} webs web 0)
string(JSON remove_out REMOVE ${remove_out} webs web 1)
message("remove_out = ${remove_out}")
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
- list
cmake_minimum_required(VERSION 3.22)
project(cmake_list)
#list变量初始化
set(src "a" "b" "c" "d;e;f")
message("src = ${src}")
#获取list变量长度
list(LENGTH src length)
message("src length = ${length}")
#list追加写入
list(APPEND src "g")
list(APPEND src "h" "i")
message("${length} src = ${src}")
# list访问 下标 0,1,2 。。。 结尾往前 -1 -2 -3
# src = a;b;c;d;e;f;g;h;i
list(GET src 1 var)
message("GET src 1 = ${var}")
list(GET src 5 var)
message("GET src 5 = ${var}")
list(GET src -1 var)
message("GET src -1 = ${var}")
list(GET src -2 var)
message("GET src -2 = ${var}")
# 拼接所有的节点
list(JOIN src "|" var)
message("JOIN ${var}")
list(JOIN src "" var)
message("JOIN ${var}")
# 取其中一部分数组
list(SUBLIST src 0 3 var)
message("SUBLIST ${var}")
# 查找内容
# src = a;b;c;d;e;f;g;h;i
list(FIND src "d" b) # 3
message("FIND ${b}")
list(LENGTH src length) # 9
math(EXPR e "${length}-${b}") # 9 -3 = 6
list(SUBLIST src ${b} ${e} var) # e 长度
message("SUBLIST ${b} ${e} ${var}")
#插入节点
# src = a;b;c;d;e;f;g;h;i
list(INSERT src 4 "d1")
list(INSERT src 2 "b1")
list(INSERT src 2 "b")
message("INSERT src ${src}")
# 删除和修改节点
# a;b;b;b1;c;d;d1;e;f;g;h;i
#通过节点值删除
list(REMOVE_ITEM src "b")
message("REMOVE src = ${src}")
# a;b1;c;d;d1;e;f;g;h;i
#删除指定位置 e
list(REMOVE_AT src 5)
#重新插入 相当于修改 E
list(INSERT src 5 "E")
message("REMOVE_AT INSERT src = ${src}")
#
#双向队列操作方式
#后端出队 b1;c;d;d1;E;f;g;h
list(POP_BACK src var)
message("POP_BACK ${var}")
message("src = ${src}")
#前端出队 先进先出 b1;c;d;d1;E;f;g;h
list(POP_FRONT src var)
message("POP_FRONT ${var}")
message("src = ${src}")
#去掉重复元素
set(rsrc "a;b;c;d;d;b;a;z;t;f")
message("rsrc = ${rsrc}")
list(REMOVE_DUPLICATES rsrc)
message("REMOVE_DUPLICATES rsrc = ${rsrc}")
# 数据排序
list(SORT rsrc)
message("SORT rsrc = ${rsrc}")
set(arr "3;23;122;157;1;5;7")
#默认字符串排序
list(SORT arr)
message("arr = ${arr}")
#自然数排序
list(SORT arr COMPARE NATURAL)
message("NATURAL arr = ${arr}")
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# 4.CMake跨平台c++编译特性设置
- cmake_target_include
cmake_minimum_required(VERSION 3.22)
project(cmake_target_include)
# WRITE 写文件 清空原数据,如果文件不存在则创建
file(WRITE a.cpp [=[
#include <iostream>
void A()
{
std::cout<<"In A "<<A_VAR<<std::endl;
}
]=]
)
# 静态库
add_library(A STATIC a.cpp)
#[[
target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
]]
# PUBLIC 改变 INCLUDE_DIRECTORIES INTERFACE_INCLUDE_DIRECTORIES
# INCLUDE_DIRECTORIES 当前目标使用的属性
# INTERFACE_INCLUDE_DIRECTORIES 依赖当前目标所使用得属性
# 相对路径会自动转为绝对路径
target_include_directories(A PUBLIC "/A_PUBLIC")
# PUBLIC 改变 INCLUDE_DIRECTORIES
target_include_directories(A PRIVATE "/A_PRIVATE")
# INTERFACE 改变 INTERFACE_INCLUDE_DIRECTORIES
target_include_directories(A INTERFACE "/A_INTERFACE")
#设定A库的宏
target_compile_definitions(A PUBLIC A_VAR=123)
#打印属性
include(CMakePrintHelpers)
cmake_print_properties(TARGETS A PROPERTIES
INCLUDE_DIRECTORIES
INTERFACE_INCLUDE_DIRECTORIES
)
# B->A
file(WRITE b.cpp [=[
#include <iostream>
void A();
void B(){
A();
std::cout<<"In B "<<A_VAR<<std::endl;
}
]=]
)
add_library(B STATIC b.cpp)
target_link_libraries(B PUBLIC A)
target_include_directories(B PUBLIC "/B_PUBLIC")
#设定B库的宏 STATIC 标志 B库编译时不需要,依赖B库的需要
target_compile_definitions(B INTERFACE STATIC=1)
# 不能打印继承的属性
cmake_print_properties(TARGETS B PROPERTIES
INCLUDE_DIRECTORIES
INTERFACE_INCLUDE_DIRECTORIES
)
#cmake原生属性调试接口
set(CMAKE_DEBUG_TARGET_PROPERTIES
INCLUDE_DIRECTORIES
INTERFACE_INCLUDE_DIRECTORIES
)
file(WRITE main.cpp [=[
#include <iostream>
int main()
{
void B();
B();
std::cout<<"In main "<<STATIC<<std::endl;
return 0;
}
]=]
)
# A public interface =>B =>main
# main->B->A
add_executable(main main.cpp)
target_link_libraries(main PUBLIC B)
#[[
target_link_libraries(<target>
<PRIVATE|PUBLIC|INTERFACE> <item>...
[<PRIVATE|PUBLIC|INTERFACE> <item>...]...)
]]
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
- target_compile_features 编译特性如c++17
file(WRITE main.cpp [=[
int main()
{
return 0;
}
]=]
)
add_executable(main main.cpp)
# c++ 17
#target_compile_features(main PRIVATE cxx_std_17)
# vs2022 有效 ubuntu 20.04 gcc无效
#target_compile_features(main PRIVATE cxx_std_23)
# 支持的特征数组
message("CMAKE_CXX_COMPILE_FEATURES = ${CMAKE_CXX_COMPILE_FEATURES} ")
foreach(var IN LISTS CMAKE_CXX_COMPILE_FEATURES)
message(${var})
endforeach()
#判断当前编译器是否支持此特性
message("--------------------------------------------")
set(f1 cxx_std_23)
if(f1 IN_LIST CMAKE_CXX_COMPILE_FEATURES)
message("${f1} OK!")
target_compile_features(main PRIVATE ${f1})
else()
message("${f1} FAILED!")
endif()
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
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
- 设置动态库输出路径
set_target_properties(dlib PROPERTIES
# windows lib文件文件的输出
ARCHIVE_OUTPUT_DIRECTORY ${OUT_LIB_PATH}
ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${OUT_LIB_PATH}/debug
ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${OUT_LIB_PATH}/release
# windos dll文件输出路径
RUNTIME_OUTPUT_DIRECTORY ${OUT_EXE_PATH}
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${OUT_EXE_PATH}/debug
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${OUT_EXE_PATH}/release
#linux .so 和mac
LIBRARY_OUTPUT_DIRECTORY ${OUT_LIB_PATH}
LIBRARY_OUTPUT_DIRECTORY_DEBUG ${OUT_LIB_PATH}/debug
LIBRARY_OUTPUT_DIRECTORY_RELEASE ${OUT_LIB_PATH}/release
#windows pdb调试文件
PDB_OUTPUT_DIRECTORY ${OUT_LIB_PATH}/pdb
PDB_OUTPUT_DIRECTORY_DEBUG ${OUT_LIB_PATH}/pdb
#debug 版本加后缀
DEBUG_POSTFIX "d"
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23