目录;
cmake语法
CMAKE_MINIMUM_REQUIRED
SET
MESSAGE
INCLUDE_DIRECTORIES
ADD_EXECUTABLE
添加链接库
基本的CMakelists.txt文件的模版为
cmake_minimum_required(VERSION 3.10) # 最低的cmake版本
project(cpp_interence) # 项目名称
set(CMAKE_CXX_STANDARD 11) # c++最低的版本,这里是c++11
include_directories(/home/gpf/Soft/mxnet/cpp-package/include)
# 增加头文件搜索路径
add_executable(cpp_interence imagenet_inference.cpp) # 创建可执行程序
target_link_libraries(cpp_interence /home/gpf/Soft/mxnet/build/libmxnet.so ) # 链接动态链接库
cmake语法
cmake 其实仍然要使用”cmake 语言和语法”去构建,上面的内容就是所谓的
”cmake 语言和语法”,最简单的语法规则是:
- 变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名
- 指令(参数1 参数2...) 参数使用括弧括起,参数之间使用空格或分号分开。以上面的 ADD_EXECUTABLE 指令为例,如果存在另外一个 func.c 源文件,就要写成: ADD_EXECUTABLE(hello main.c func.c)或者
ADD_EXECUTABLE(hello main.c;func.c) - 指令是大小写无关的,参数和变量是大小写相关的。但,推荐你全部使用大写指令。
- cmake 的语法还是比较灵活而且考虑到各种情况,比如 SET(SRC_LIST main.c)也可以写成SET(SRC_LIST “main.c”) 是没有区别的,但是假设一个源文件的文件名是fu nc.c(文件名中间包含了空格)。这时候就必须使用双引号,如果写成了SET(SRC_LIST fu nc.c),就会出现错误,提示 你找不到 fu 文件和 nc.c 文件。这种情况,就必须写成:SET(SRC_LIST “fu nc.c”)
CMAKE_MINIMUM_REQUIRED
其语法为
CMAKE_MINIMUM_REQUIRED(VERSION versionNumber [FATAL_ERROR])
比如CMAKE_MINIMUM_REQUIRED(VERSION 2.5 FATAL_ERROR)
如果 cmake 版本小与 2.5,则出现严重错误,整个过程中止。
PROJECT
PROJECT(projectname [CXX] [C] [Java])
你可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的, 默认情况表示支持所有语言。这个指令隐式的定义了两个 cmake 变量: <projectname>_BINARY_DIR 以及<projectname>_SOURCE_DIR,这里就是 HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR(所以 CMakeLists.txt 中两个 MESSAGE 指令可以直接使用了这两个变量),同时 cmake 系统也帮助我们预定义了 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR 变量,他们的值分别跟 HELLO_BINARY_DIR 与 HELLO_SOURCE_DIR 一致。
为了统一起见,建议以后直接使用 PROJECT_BINARY_DIR,PROJECT_SOURCE_DIR,即 使修改了工程名称,也不会影响这两个变量。
假设项目目录:/path/to/cmake/project
因为采用的是内部编译,两个变量(PROJECT_BINARY_DIR,PROJECT_SOURCE_DIR)目前指的都是工程所在路径/path/to/cmake/project,如果是外部编译,两者所指代的内容会有所不同。一般外部编译是在/path/to/cmake/project/build,(PROJECT_BINARY_DIR=/path/to/cmake/project/build,PROJECT_SOURCE_DIR=path/to/cmake/project/)
SET
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
SET 指令可以用来显式的定义变量或者为已有变量重新赋值
比如我们用到的是 SET(SRC_LIST main.c),如果有多个源文件,也可以定义成: SET(SRC_LIST main.c t1.c t2.c)。
MESSAGE
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
这个指令用于向终端输出用户定义的信息,包含了三种类型:
- SEND_ERROR,产生错误,生成过程被跳过。
- SATUS,输出前缀为—的信息。
- FATAL_ERROR,立即终止所有 cmake 过程.
INCLUDE_DIRECTORIES
INCLUDE_DIRECTORIES,其完整语法为:
INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
这条指令可以用来向工程添加多个特定的头文件搜索路径,路径之间用空格分割,如果路径
中包含了空格,可以使用双引号将它括起来,默认的行为是追加到当前的头文件搜索路径的
后面,你可以通过两种方式来进行控制搜索路径添加的方式:
1,CMAKE_INCLUDE_DIRECTORIES_BEFORE,通过 SET 这个 cmake 变量为 on,可以 将添加的头文件搜索路径放在已有路径的前面。
2,通过 AFTER 或者 BEFORE 参数,也可以控制是追加还是置前。
ADD_EXECUTABLE
ADD_EXECUTABLE(hello ${SRC_LIST})
定义了这个工程会生成一个文件名为 hello 的可执行文件,相关的源文件是 SRC_LIST 中
定义的源文件列表
添加链接库
(1)LINK_DIRECTORIES 的全部语法是:
LINK_DIRECTORIES(directory1 directory2
这个指令非常简单,添加非标准的共享库搜索路径,比如,在工程内部同时存在共享库和可执行二进制,在编译时就需要指定一下这些共享库的路径。
该指令仅仅是增加了库文件的搜索路径(与INCLUDE_DIRECTORIES类似),使得在链接库时能够找到相应的库。真正指定链接哪些库的是TARGET_LINK_LIBRARIES指令
(2)TARGET_LINK_LIBRARIES 的全部语法是:
TARGET_LINK_LIBRARIES(target library1 <debug | optimized> library2 ...)
这个指令可以用来为 target 添加需要链接的库。
RF:
cmake practice 中文版