当前位置: 首页 > news >正文

cmake语法:option,add_definition,add_dependencies的基本作用

add_dependencies

在cmake中,add_dependencies的作用是为了指明当前的执行程序依赖的动态库,而在编译的时候,对于依赖关系,会告诉编译器针对动态库编译的先后顺序,对于以下的命令:

ADD_EXECUTABLE(main main.cpp)
TARGET_LINK_LIBRARIES(main a.so b.so c.so d.so)

首先是生成执行程序,通过main.cpp,生成main,在生成main的时候,TARGET_LINK_LIBRARIES链接到了四个动态库,而此时已经生成了main,所以会提示main函数链接的时候出现错误。一些符号的定义找不到,而这些符号恰恰就在这几个库中,假设在a.so 和 b.so中,在上述两条指令之间加上一条指令即可编译通过:

ADD_DEPENDENCIES(main a.so b.so)

原因比较简单,生成main需要依赖a.so和b.so中的符号定义,然而a.so和b.so库的生成是在main编译生产之后的,添加这条语句就是提醒编译器需要先生成main的依赖(a.so,b.so),然后再去生成main.

option

使用场景:通过编译脚本(CMakeLists)传递参数(源代码中定义的宏)

#include <iostream>
int main() {
#ifdef TEST
std::cout<<"Hello,Test"<<std::endl;
#endif
std::cout << "Hello, World!" << std::endl;
return 0;
}

CMakeLists.txt 内容如下:

cmake_minimum_required(VERSION 3.13)
project(cmake_option_example_00)
set(CMAKE_CXX_STANDARD 14)
option(TEST "option for TEST" OFF)
if(TEST)
add_definitions(-DTEST)
endif()
add_executable(cmake_option_example_00 main.cpp)

其中:
option 的格式如下:

option(编译开关 “一些简单的描述” NO/OFF)
option(TEST "option for TEST" OFF)

编译命令:

cmake .
cmake -DTEST=NO .

add_definitions

add_definitions的功能和C/C++中的#define是一样的,

#include <iostream>
int main()
{
#ifdef TEST_IT_CMAKE
	std::cout<<"in ifdef"<<std::endl;
#endif
	std::cout<<"not in ifdef"<<std::endl;
}

cmake_minimum_required(VERSION 3.10)
project(optiontest)

add_executable(optiontest main.cpp)
option(TEST_IT_CMAKE "test" ON)
message(${TEST_IT_CMAKE})
if(TEST_IT_CMAKE)
	message("itis" ${TEST_IT_CMAKE})
	add_definitions(-DTEST_IT_CMAKE)
endif()

其中的下边两部分一般是连在一起用的(message语句仅为了更好的输出变量,无特殊意义)

option(TEST_IT_CMAKE "test" ON)
message(${TEST_IT_CMAKE})
if(TEST_IT_CMAKE)
	message("itis" ${TEST_IT_CMAKE})
	add_definitions(-DTEST_IT_CMAKE)
endif()

通过option设置一个变量,并通过add_definitions将其转换为#define TEST_IT_CMAKE

相关文章:

  • Nmap详细使用
  • CREO:CREO软件之工程图【注释】之尺寸、注解、表面粗糙度、符号、几何公差的简介及其使用方法(图文教程)之详细攻略
  • FastAPI 学习之路(三十)中间件
  • Springboot整合redis
  • Python对象序列化
  • Linux-Linux内核-进程调度
  • LabVIEW重入:允许同时调用同一子VI
  • 『网易实习』周记(五)
  • 【glib】vs2022 v163 debug win32: meson构建 glib-2.67.6
  • JlinkV9的Vtref详解
  • Thinkphp5.1对接ueditor(自定义上传接口)
  • “双非”渣本投岗爱奇艺(Java),三轮技术面等消息,侥幸通过!
  • FlinkSQL系列04-CDC连接器
  • 包-node.js中的第三方模块
  • vscode 个人实用插件(资源集合)
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • ComponentOne 2017 V2版本正式发布
  • es6(二):字符串的扩展
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • flutter的key在widget list的作用以及必要性
  • git 常用命令
  • Phpstorm怎样批量删除空行?
  • Yeoman_Bower_Grunt
  • 复杂数据处理
  • 后端_ThinkPHP5
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 阿里云ACE认证学习知识点梳理
  • 进程与线程(三)——进程/线程间通信
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #微信小程序:微信小程序常见的配置传旨
  • $forceUpdate()函数
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (pojstep1.1.2)2654(直叙式模拟)
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)c52学习之旅-简单了解单片机
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (顺序)容器的好伴侣 --- 容器适配器
  • (转)h264中avc和flv数据的解析
  • (转)Sublime Text3配置Lua运行环境
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .bat批处理出现中文乱码的情况
  • .net framework 4.0中如何 输出 form 的name属性。
  • .Net MVC + EF搭建学生管理系统
  • .net refrector
  • .NET 读取 JSON格式的数据
  • .NET单元测试