CMake基本使用

一、 基础指令

0、

指令是大小写无关的,参数和变量是大小写相关的。

1、set()指令

set(var <value>),用来显式的定义变量

2、add_subdirectory()

add_subdirectory(source_dir [binary_dir]),用于向当前工程添加存放源文件的子目录,即当前目录下还有一个文件夹里有需要编译的源码,并可以指定中间二进制和目标二进制存放的位置。

3. 链接共享库

target_link_libraries(target library1 library2 ...),为 target(可执行程序) 添加需要链接的共享库

4、特殊的环境变量

cmake_include_path()
cmake_library_path()
如果头文件没有存放在常规路径(/usr/include, /usr/local/include 等),则可以通过这些变量就行弥补。

5、头文件搜索路径

include_directories(directory1 directory2 ...),寻找包的头文件。
如:

include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/include
${EIGEN3_INCLUDE_DIR}
)
6、常用指令

1、find_path(<VAR> name1 path1 path2 ...),用来在指定路径中搜索文件名,VAR 变量代表包含这个文件的路径。
2、find_file(<VAR> name1 path1 path2 ...),VAR 变量代表找到的文件全路径,包含文件名
3、find_package

// 参数QUIET表示紧掉包没有被发现时的警告信息, 
// REQUIRED表示若包没有找到则cmake过程停止
find_package(第三方包名 需要的最低版本号 REQUIRED/QUIET)

如:

find_package(Eigen3 3.1.0 REQUIRED)
find_package(Pangolin REQUIRED)
find_package(OpenCV 3.0 QUIET)

4、add_dependencies(target-name depend-target1 depend-target2 ...),定义 target 依赖的其他 target,确保在编译本 target 之前,其他的 target 已经被构建。
5、aux_source_directory(<dir> <VARIABLE>),发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表。比如在 add_executable 中源文件很多,把所有源文件的名字都加进去将是一件烦人的工作。这时可以这么写

# 查找当前目录下的所有源文件,并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# 指定生成目标
add_executable(Demo ${DIR_SRCS})

6、project() ,会隐式的定义<projectname>_BINARY_DIR<projectname>_SOURCE_DIR两个变量,即生成工作文件目录路径。
7、file(GLOB variable [RELATIVE path] [globbing expressions]...)
GLOB 用于产生一个文件(目录)路径列表并保存在variable 中,文件路径列表中的每个文件的文件名都能匹配globbing expressions(非正则表达式,但是类似)。如果指定了 RELATIVE 路径,那么返回的文件路径列表中的路径为相对于 RELATIVE 的路径。

7、常用变量

1、CMAKE_CURRENT_SOURCE_DIR,指的是当前处理的 CMakeLists.txt 所在的路径
2、CMAKE_MODULE_PATH,这个变量用来定义自己的 cmake 模块所在的路径。如果你的工程比较复杂,有可能会自己编写一些 cmake 模块,这些 cmake 模块是随你的工程发布的,为了让 cmake 在处理CMakeLists.txt 时找到这些模块,你需要通过 SET 指令,将自己的 cmake 模块路径设
置一下。比如
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
这时候你就可以通过 INCLUDE 指令来调用自己的模块了。

二、添加链接库

1、动态链接库

使用LINK_DIRECTORIES() 命令来指定第三方库所在路径;
target_link_libraries(target library ),为 target(可执行程序) 添加需要链接的共享库
如:

link_directories(${PROJECT_SOURCE_DIR}/lib) #添加动态连接库的路径
target_link_libraries(-lmylib ) #添加libmylib.so
2、静态链接库

静态库的添加:

add_library(mxnet STATIC IMPORTED)
set_property(TARGET mxnet PROPERTY IMPORTED_LOCATION /path/to/libmxnet.a)
target_link_libraries(project_name mxnet ) #添加libmxnet.a
3、进阶

如果电脑中安装了两个版本的OpenCV,需要选择一个。首先确定OpenCV不同版本在电脑中的安装位置,如果是在/usr/local下以不同版本号命名:
在这里插入图片描述这里可以看到/usr/local下有两个不同版本opencv,opencv2.4.13和opencv3.4.8,下面来看看我们的CMakeLists如何改:

// 明确find_package的寻找路径
set(OpenCV_DIR /usr/local/opencv2.4.13/share/OpenCV)
find_package(OpenCV 2.4 REQUIRED)

// 告诉系统头文件在哪里
 include_directories(SYSTEM ${OpenCV_INCLUDE_DIRS} /usr/local/opencv2.4.13/include)

// 告诉第三方库文件在哪里
link_directories(${OpenCV_LIBRARY_DIRS} /usr/local/opencv2.4.13/lib)

// 将库文件与项目链接上
target_link_libraries(${项目名} ${OpenCV_LIBRARY_DIRS})
参考文章

【技巧一分钟】CMakeLists.
参考

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值