-
Notifications
You must be signed in to change notification settings - Fork 0
/
CMAKE
96 lines (79 loc) · 4.22 KB
/
CMAKE
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
${PROJECT_SOURCE_DIRS}/include表示当前路径,相对路径,对于程序移植时,必须使用相对路局
一般用法:
https://blog.csdn.net/damenhanter/article/details/53859779
cmake编译时打印出消息:
message()
命令:
Cmake命令不区分大小写,参数使用空格区分
1.#注释
2.变量:使用set命令显式定义及赋值,在非if语句中,使用${}引用,if中直接使用变量名引用;后续的set命令会清理变量原来的值;
3.command (args ...) #命令不分大小写,参数使用空格分隔,使用双引号引起参数中空格
4.set(var a;b;c) <=> set(var a b c) #定义变量var并赋值为a;b;c这样一个string list
5.Add_executable(${var}) <=> Add_executable(a b c) #变量使用${xxx}引用
6.条件语句:
if(var) #var 非empty 0 N No OFF FALSE... #非运算使用NOT
…
else()/elseif() … endif(var)
7.用来显式的定义变量
Set(VAR a b c)
SET (SRC_LST main.c other.c)
说明: 用变量代替值,例子中定义SRC_LST代替后面的字符串。
Foreach(f ${VAR}) …Endforeach(f)
8.循环语句
WHILE() … ENDWHILE()
${HELLO_SOURCE_DIR}表示项目根目录
https://blog.csdn.net/weixin_41245919/article/details/82793643
cmake编译动态库/静态库
如:hello目下:
mkdir lib
touch CMakelist.txt
mkdir build
CMakelist.txt文件内容如下:
PROJECT(HELLOLIB)
在主工程文件中CMakelist.txt中修改ADD_SUBDIRECTORY(lib)指令来指定一个编译输出位置;
#指定本工程中静态库libhello.a的生成位置.即build/lib
也可以编译为其他位置:
#ADD_SUBDIRECTORY(lib lib_new)
则:静态库libhello.a生成的静态位置为build/lib_new;
在lib目录下建立两个源文件hello.cpp和hello.h
在lib目录下建立CMakeLists.txt
SET(LIBHELLIO_SRC hello.cpp)
###SET (LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) shared 动态库 static 静态库
添加动态库
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
添加静态库
ADD_LIBRARY(hello_static SHARED ${LIBHELLO_SRC})
如果动态库与静态库两个都需要创建时,都写同一个target,是冲突的.
按照习惯,动态库和静态库名字应该相同,只是扩展名不同;
所以希望"hello_static"在输出时,不是"hello_static",而是以"hello"的名字显示,故设置如下:
SET_TARGET_PROPERTIES (hello_static PROPERTIES OUTPUT_NAME "hello")
GET_TARGET_PROPERTY (OUTPUT_VALUE hello_static OUTPUT_NAME)
MESSAGE (STATUS "This is the hello_static OUTPUT_NAME: " ${OUTPUT_VALUE})
cmake在构建一个新的target时,会尝试清理掉其他使用这个名字的库,因此在构建libhello.a,就会清理掉libhello.so为了回避这个问题,比如再次使用
SET_TARGET_PROPERTIES定义 CLEAN_DIRECT_OUTPUT属性。
SET_TARGET_PROPERTIES (hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES (hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
#按照规则,动态库是应该包含一个版本号.
#VERSION指代动态库版本,SOVERSION指代API版本.
SET_TARGET_PROPERTIES (hello PROPERTIES VERSION 1.2 SOVERSION 1)
我们需要将libhello.a, libhello.so.x以及hello.h安装到系统目录,才能真正让其他人开发使用
# 在本例中我们将hello的共享库安装到<prefix>/lib目录;
# 将hello.h安装<prefix>/include/hello目录。
INSTALL (TARGETS hello hello_static LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
INSTALL (FILES hello.h DESTINATION include/hello)
在build目录中,
cmake..
make
INCLUDE_DIRECTORIES(添加头文件目录)
它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用(这里特指c++。c和Java中用法类似)。
LINK_DIRECTORIES(添加需要链接的库文件目录)
它相当于g++命令的-L选项的作用,也相当于环境变量中增加LD_LIBRARY_PATH的路径的作用
比如:
include_directories("/opt/MATLAB/R2012a/extern/include")
LINK_LIBRARIES (添加需要链接的库文件路径,注意这里是全路径)
比如:
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so")
TARGET_LINK_LIBRARIES (设置要链接的库文件的名称)
语法:TARGET_LINK_LIBRARIES(targetlibrary1 <debug | optimized> library2 ..)
TARGET_LINK_LIBRARIES(myProject hello),连接libhello.so库