常用CMake命令总结

常用CMake命令总结

message():打印信息
message(STATUS " version: ${OpenCV_VERSION}")

  1. add_executable():编译出一个可执行文件
  • add_executable(ctest test.cc) // 生成ctest可执行文件
  1. add_library():编译出一个库文件(需指定生成静态(STATIC)或动态(SHARED)/动态库)
  • add_library(CheckLicenseJava SHARED check_license_jni.cc) // 生成libcheck_license_java.so动态库
  1. set()/target_link_libraries()/target_include_directories()
set(): 设置变量(可以是具体的库文件.so/.h, 也可以是一个文件夹)
- set(PICASSOLIB ${CURR_ROOT_DIR}/lib/libcheck_license.so)
- set(PICASSOINC ${CURR_ROOT_DIR}/include/)* set()连同add_executable()和add_library(),可以将.so/.h文件添加到可执行文件或者新的动态链接库中
target_link_libraries(): 将设置的库变量添加到可执行文件或者新的动态链接库中
target_include_directories():将设置的头文件变量添加到可执行文件或者新的动态链接库中
target_link_libraries(<target><PRIVATE|PUBLIC|INTERFACE> <item>...[<PRIVATE|PUBLIC|INTERFACE> <item>...]...)
- target_link_libraries(ctest ${PICASSOLIB})
- target_include_directories(ctest PUBLIC ${PICASSOINC})
  1. find_package():查找工具依赖包
find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE][REQUIRED] [[COMPONENTS] [components...]][OPTIONAL_COMPONENTS components...][NO_POLICY_SCOPE])- <PackageName>:待查找的包名
- [version]:待查找的包的版本
- [EXACT]:必须是精确的版本匹配
- [REQUIRED]:若找不到包,则终止cmake过程* 使用find_package()实际上查找的是<package_name>Config.cmake,当找到目标后会自动获取3个变量的值:<PackageName>_DIR、<PackageName>_INCLUDE_DIRS和<PackageName>_LIBS。find_package(OpenCV 3.4.16 REQUIRED)
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})  // 可选,将OpenCV的头文件路径添加到编译器的搜索路径中

编译一个简单的项目

当需要编译一个简单的项目,生成动态链接库以及可执行文件,可以进行参考。

一次编译生成动态链接以及可执行文件时,一般来说可执行文件加载的仍是源代码。所以如果还要验证动态链接库的可用性,最好再新建一个项目和CMakeLists.txt,通过target_link_libraries()链接动态链接库生成一个新的可执行文件来验证。
易犯错误:以下方文件tree为例,core文件夹中包含了一些需要链接的文件,在core对应的CMakeLists.txt中需要将所有文件链接为libcore.a/.so。而在src中的test.cc中需要使用core中这些接口,所以在src的CMakeLists.txt中必须要链接core,否则虽然能够cmake ..通过,但是make -j时会提示test.cc所使用的core中的很多方法未定义。

文件树

|-- CMakeLists.txt
|-- build
|   |-- CMakeCache.txt
|   |-- CMakeFiles
|   |-- Makefile
|   |-- bin
|   |-- cmake_install.cmake
|   |-- core
|   |-- example
|   |-- lib
|   -- src
|-- cmake
|   -- aarch64-linux-gnu.toolchain.cmake
|-- config.ini
|-- core
|   |-- CMakeLists.txt
|   |-- common
|   |-- define.h
|   |-- encrypt
|   |-- flatbuffers
|   |-- io.cc
|   |-- io.h
|   -- json
|-- example
|   |-- CMakeLists.txt
|   -- test.cc
|-- include
|   |-- check_license.h
|   -- slog.hpp
|-- src
|   |-- CMakeLists.txt
|   -- check_license.cc
-- aa.txt

core中对应的CMakeLists.txt,将所有文件打包为core。

# 将所有文件存储在src中; CMAKE_CURRENT_SOURCE_DIR:./core/
file(GLOB src ${CMAKE_CURRENT_SOURCE_DIR}/*.cc${CMAKE_CURRENT_SOURCE_DIR}/*.c${CMAKE_CURRENT_SOURCE_DIR}/common/*.*${CMAKE_CURRENT_SOURCE_DIR}/json/*.*)  # 新增set(LIB_TYPE STATIC)
# 导入./check_license/core/encrypt/libencrypt_x86_64.a库
add_library(encrypt ${LIB_TYPE} IMPORTED GLOBAL)
set_target_properties(encrypt PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/encrypt/libencrypt_x86_64.a_ori) # libencrypt_${arch}.${LIB_TAIL}# 添加编译选项
if(NOT SHARED_LIB)add_compile_options(-fPIC -std=c++11)
endif()
# 创建core库
add_library(core ${LIB_TYPE} ${src})target_link_libraries(core encrypt)set_target_properties(core PROPERTIES FOLDER "xxxxxxx")
Message(STATUS ${CMAKE_CURRENT_SOURCE_DIR})add_custom_target(core_installCOMMAND ${CMAKE_COMMAND} -E make_directory coreCOMMAND ${CMAKE_COMMAND} -E make_directory core/cmakeCOMMAND ${CMAKE_COMMAND} -E copy lib/libcore.${LIB_TAIL} core/COMMAND ${CMAKE_COMMAND} -E copy_directory  ${CMAKE_CURRENT_SOURCE_DIR}/flatbuffers core/flatbuffersCOMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/common/licence.h core/commonCOMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/common/io.h core/commonCOMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/common/common.h core/commonCOMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/common/md5.h core/commonCOMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/common/sys.h core/commonCOMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/common/MachineInfo_generated.h core/commonCOMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/cmake/modules/FindGFlags.cmake core/cmake# COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/cmake/modules/FindGlog.cmake core/cmakeCOMMENT  "make core install"WORKING_DIRECTORY ${PROJECT_BINARY_DIR})set_target_properties(core_install PROPERTIES FOLDER "xxxxxx")

src中的CMakeLists.txt。

# 将 src 中的文件编译为库(SHARED:动态库; STATIC:静态库)
add_library(check_license SHAREDcheck_license.cc
)# 添加 include 目录(确保头文件可以被找到)
target_include_directories(check_license PUBLIC ${CMAKE_SOURCE_DIR}/include)
# 链接core,否则无法找到core中方法,无法编译通过
target_link_libraries(check_license PUBLIC core)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/34529.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

macmini安装ubuntu网卡驱动BCM4360

安装成功效果如下 成功连接wifi 成功分配到IP 执行命令如下 1. sudo apt update 2. sudo apt install broadcom-sta-dkms 3. 重启电脑

OSCP - Proving Grounds - Fanatastic

主要知识点 CVE-2021-43798漏洞利用 具体步骤 执行nmap 扫描&#xff0c;22/3000/9090端口开放&#xff0c;应该是ssh,grafana 和Prometheus Nmap scan report for 192.168.52.181 Host is up (0.00081s latency). Not shown: 65532 closed tcp ports (reset) PORT STA…

24/12/5 算法笔记<强化学习> doubleDQN,duelingDQN

我们前面了解了DQN网络的一些知识&#xff0c;然而DQN还有一些改进的方法&#xff0c;比如doubleDQN和duelingDQN,我们先来将一下doubleDQN和DQN. 先来对比一下 单一网络 vs. 双重网络 DQN:是一个深度神经网络来估计每个动作的Q值 DDQN:使用两个独立的深度神经网络&#xf…

时长输入框、用时输入框

时长输入框、用时输入框 行内组件&#xff0c;用于设定 【时 分 秒】 时长&#xff0c;转存结果为 【毫秒】 <template><div class"time-inputs"><div classtime-input-div v-ifinput><input classtime-input type"number" v-mod…

java反射的基础应用

一、堆内存中的情况 &#xff08;一&#xff09;对象创建与变化 源对象&#xff08;UserBo&#xff09;和目标对象&#xff08;User&#xff09; 在执行UserBo sourceObj new UserBo(username, password);和User targetObj new User();时&#xff0c;分别在堆内存中创建了U…

Unity3D常见的设计模式(五)

系列文章目录 unity知识点 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、桥接模式&#xff08;Bridge&#xff09;&#x1f449;二、适配器模式&#xff08;Adapter&#xff09;&#x1f449;三、 外观模式&#xff08;Facade&#xff09;&#x1f449;四、原型模…

车机端同步outlook日历

最近在开发一个车机上的日历助手&#xff0c;其中一个需求就是要实现手机端日历和车机端日历数据的同步。然而这种需求似乎没办法实现&#xff0c;毕竟手机日历是手机厂商自己带的系统应用&#xff0c;根本不能和车机端实现数据同步的。 那么只能去其他公共的平台寻求一些机会&…

群控系统服务端开发模式-应用开发-邮件工厂结构封装

首先在系统根目录下extend文件夹下创建邮件工厂文件夹并更名叫Mail。 一、邮件发送父类 在Mail目录下创建邮件发送父类并更名为MailSenderInterface.php&#xff0c;代码如下 <?php /*** 邮件发送父类* User: 龙哥三年风水* Date: 2024/12/5* Time: 14:22*/ namespace Ma…

React性能优化

三个可以优化的地方 避免过度多次渲染 组件会在以下情况下重新渲染 注意&#xff1a;例如组件组合的形式&#xff0c;<Test><Counter></Counter></Test>,即使Test发生了重新渲染&#xff0c;Counter也不会重新渲染。另外使用React这样的库或框架时&a…

操作系统学习

问题&#xff1a; 因为想用傲梅来给系统盘扩容&#xff0c;导致无法进入操作系统&#xff0c;报错如下&#xff1a; 无法加载应用程序或操作系统&#xff0c;原因是所需文件丢失或包含错误. 文件:Windowslsystem32lwinload.efi错误代码: 0xc000007b 你需要使用恢复工具。如果…

Web应用程序文件包含-Server2233-解析

B-6 Web应用程序文件包含 任务环境说明:服务器场景名称:Server2233

计算机的错误计算(一百七十五)

摘要 就计算机的错误计算&#xff08;一百七十三&#xff09;与&#xff08;一百七十四&#xff09;中案例&#xff0c;讨论其另外一种形式&#xff1a; 的错误计算问题。 例1. 已知 计算 直接贴图吧&#xff1a; 这样&#xff0c;MATLAB的输出中有4位错误数字&#xff0…

F-K变换法

f-k变换实质上是一种二维傅里叶变换。 在时间域上,对一道地震信号做傅里叶变换,可以得到在时间上不同频度(称为频率)的 波动组分的振幅和相位信息。同样地,在空间上,我们也可以对多道地震信号做类似傅里叶变 换的数值变换,得到在空间上不同频度(称为波数)的波动组分的振幅…

webstorm关闭了弹窗 Confirm Exit 恢复回来

webstorm关闭了 Confirm Exit WebStorm 关闭了“Confirm Exit”功能&#xff0c;意味着当用户尝试关闭IDE时&#xff0c;不会显示确认对话框&#xff0c;直接退出程序。 如果你想要恢复这个功能&#xff0c;可以按照以下步骤操作&#xff1a; 打开WebStorm。 进入设置界面&a…

集成学习之-stacking

一、引言 对于单模型来说&#xff0c;模型的抗干扰能力低&#xff0c;且难以拟合复杂的数据。 所以可以集成多个模型的优缺点&#xff0c;提高泛化能力。 集成学习一般有三种&#xff1a;boosting是利用多个弱学习器串行&#xff0c;逐个纠错&#xff0c;构造强学习器。 baggin…

Linux-使用 tslib 库

上一章我们学习了如何编写触摸屏应用程序&#xff0c;包括单点触摸和多点触摸&#xff0c;主要是对读取到的 struct input_event 类型数据进行剖析&#xff0c;得到各个触摸点的坐标。本章向大家介绍 tslib 库&#xff0c;这是 Linux 系统下&#xff0c;专门为触摸屏开发的应用…

SHELL----正则表达式

一、文本搜索工具——grep grep -参数 条件 文件名 其中参数有以下&#xff1a; -i 忽略大小写 -c 统计匹配的行数 -v 取反&#xff0c;不显示匹配的行 -w 匹配单词 -E 等价于 egrep &#xff0c;即启用扩展正则表达式 -n 显示行号 -rl 将指定目录内的文件打…

[Redis#15] 持久化 | AOF | rewrite | aof_buf | 混合持久化

目录 1 使用AOF 流程 问题一&#xff1a;父进程在fork之后继续写旧AOF文件的意义 问题二&#xff1a;执行BGREWRITEAOF时的特殊情况处理 2 命令写入 3 文件同步 4 重写机制 工作流程&#xff1a; 触发条件 混合持久化 持久化 sum AOF&#xff08;Append Only File&a…

重生之我在异世界学智力题(1)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言智力题题目&#xff1a;《奇怪的时钟…

【WRF后处理】WRF时区(UTC)需转化为北京时间(CST)!!!

目录 WRF运行时间标准注意事项-本地时区问题 输入数据&#xff1a;ERA5时间标准ERA5数据和WRF模型需要转换为北京时间&#xff01;&#xff01;&#xff01;北京时间&#xff08;CST&#xff09;与协调世界时&#xff08;UTC&#xff09;的关系转换方法 参考 WRF运行时间标准 …