CMake--模块的使用和自定义模块
2024-10-15 14:58:31
1.链接外部库
如果程序中使用了外部库,事先并不知道它的头文件和链接库的位置,就要给出头文件和链接库的查找方法,并将他们链接到程序中。
FIND_PACKAGE(<name> [major.minor] [QUIET] [NO_MODULE]
[[REQUIRED|COMPONENTS] [componets...]])
1) find_package()的查找路径
find_package()命令首先会在模块路径中寻找 一个事先编译好的Find.cmake文件,而且一般官方给出了很多,不需要自己编写这是查找库的一个典型方式。
具体查找路径依次为CMake:
模块模式
- ${CMAKE_MODULE_PATH}中的所有目录。
- 模块目录 /share/cmake-x.y/Modules/ 这称为。
配置模式
- ~/.cmake/packages/或/usr/local/share/中的各个包目录中查找,寻找<库名字的大写>Config.cmake 或者 <库名字的小写>-config.cmake (比如库Opencv,它会查找/usr/local/share/OpenCV中的OpenCVConfig.cmake或opencv-config.cmake)。
2) *.cmake文件定义变量
不管使用哪一种模式,只要找到.cmake,.cmake里面都会定义下面这些变量:
<NAME>_FOUND
<NAME>_INCLUDE_DIRS or <NAME>_INCLUDES
<NAME>_LIBRARIES or <NAME>_LIBRARIES or <NAME>_LIBS
<NAME>_DEFINITIONS
注意大部分包的这些变量中的包名是全大写的,如 LIBFOO_FOUND ,有些包则使用包的实际大小写,如 LibFoo_FOUND
3)添加头文件与链接库文件
如果找到这个包,则可以通过在工程的顶层目录中的CMakeLists.txt 文件添加 include_directories(_INCLUDE_DIRS) 来包含库的头文件,添加target_link_libraries(源文件 _LIBRARIES)命令将源文件与库文件链接起来。
4) 链接OpenCV的例子
创建t4目录添加cmake目录与main.cpp与CMakeList.txt文件
创建cmake目录添加FindOpenCV.cmake文件。
CMakeList.txt
cmake_minimum_required(VERSION 2.8)
PROJECT (HELLO)
SET(SRC_LIST main.cpp)
INCLUDE_DIRECTORIES(cmake)
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
#在${CMAKE_MODULE_PATH}中添加包含FindOpenCV.cmake目录
FIND_PACKAGE(OpenCV)
#获取OPENCV_FOUND OPENCV_INCLUDE_DIR OPENCV_LIBRARIES
INCLUDE_DIRECTORIES(${OPENCV_INCLUDE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
TARGET_LINK_LIBRARIES(hello ${OPENCV_LIBRARIES})
main.cpp
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat image = cv::imread("../timg.jpeg");
if (!image.empty()) {
cv::imshow("image", image);
cv::waitKey(-1);
} else {
std::cout << "Can not get image." << std::endl;
}
return 0;
}
2.自定义模块(作业)
编写FindHello.cmake与CMakeList.txt文件,将CMAKE工程小结所安装的hello链接至主函数,调用HelloFunc()函数输出相应内容:
给出main.c 文件:
#include <hello/hello.h>
int main()
{
HelloFunc();
return 0;
}
最新文章
- Mac挂载NTFS移动硬盘读取VMware虚拟机文件
- visual studio2015从git上clone(克隆)项目
- 11.8---维护x的秩(CC150)
- macosx安装MySQLdb
- Resharper团队协作之TODO
- [SQL]把同一字段里的多行数据用一行显示
- 获取div相对文档的位置
- Scala初体验
- iOS-NSTimer-pause-暂停-引用循环
- 查看library_cache 库缓冲区的命中率
- PHP 过滤二维数组和三维数组
- jQuery的类数组对象结构
- Android中如何查看内存(下)
- hdu 5636 搜索 BestCoder Round #74 (div.2)
- 实现Kubernetes跨集群服务应用的高可用
- spring boot读取classpath下的json文件
- flock - 必应词典
- 全面了解移动端DNS域名劫持等杂症:原理、根源、HttpDNS解决方案等
- 解决xp突然出现开机登录界面的问题
- Git删除分支/恢复分支
热门文章
- Why do Kafka consumers connect to zookeeper, and producers get metadata from brokers?
- Win7 下安装ubuntu14.04双系统
- vue-cli脚手架搭建的项目怎么去除eslint验证
- python六十四课——高阶函数练习题(一)
- 使用chrome远程调试设备及调试模拟器设备
- UVA11925-Generating Permutations(贪心)
- 【转】iOS-浅谈revoke证书对App的影响
- Rsync服务实战
- sqlachemy 获取新创建对象的id,flush与commit
- jenkins+mail邮件配置