前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >cmake:在各级子项目(目录)之间共享变量

cmake:在各级子项目(目录)之间共享变量

作者头像
10km
发布2022-05-07 10:13:56
1.7K0
发布2022-05-07 10:13:56
举报
文章被收录于专栏:10km的专栏

项目目录结构如下图,facedetect和facefeature都要用到opencl中的include文件,1.2,2.0,2.1是不同的opencl版本的头文件,希望在cmake创建Makefile时,opencl文件夹下的CMakeLists.txt能定义类似INCLUDE_OPENCL_1_2,INCLUDE_OPENCL_2_0,INCLUDE_OPENCL_2_1,这样的变量,以保存不同版本的opencl 头文件位置,最后关键是能让项目中其他子目录的CMakeList.txt能使用这些变量。

代码语言:javascript
复制
├─facedetect
├─facefeature
└─opencl
    └─include
       ├─1.2
       │  └─CL
       ├─2.0
       │  └─CL
       └─2.1
           └─CL

方法一 set:

一般用set命令定义的变量能从父目录传递到子目录,但opencl与facedetect和facefeature在同级目录,所以用set定义的变量无法共享,要用set(variable value CACHE INTERNAL docstring )这种方式定义的变量会把变量加入到CMakeCache.txt然后各级目录共享会访问到这个变量 比如: 在opencl下的CMakeLists.txt中定义一个变量

代码语言:javascript
复制
set(ICD_LIBRARY "${PROJECT_BINARY_DIR}/lib" CACHE INTERNAL "ICD Library location" )
//"ICD Library location"这个字符串相当于对变量的描述说明,不能省略,但可以自己随便定义

在facedetect下的CMakeLists.txt中读取这个一个变量

代码语言:javascript
复制
MESSAGE(STATUS "ICD_LIBRARY :${ICD_LIBRARY}")

每次运行cmake都会更新这个变量,你会在CMakeCache.txt中找到这个变量

//ICD Library location ICD_LIBRARY:INTERNAL=J:/workspace/facecl.prj/lib

方法二 set_property/get_property:

使用set_property实现共享变量的方法,不会将变量写入CMakeCache.txt,应该是内存中实现的。 当用set_property定义的property时,第一个指定作用域(scope)的参数设为GLOBAL,这个property在cmake运行期间作用域就是全局的。然后其他目录下的CMakeLists.txt可以用get_property来读取这个property 比如: 在opencl下的CMakeLists.txt中定义一个名为INCLUDE_OPENCL_1_2 的global property

代码语言:javascript
复制
set_property(GLOBAL PROPERTY INCLUDE_OPENCL_1_2 "${CMAKE_CURRENT_LIST_DIR}/include/1.2" )

在facedetect下的CMakeLists.txt中读取这个一个property

代码语言:javascript
复制
//先调用get_property将这个property读取到一个变量中(variable)INCLUDE_OPENCL 
get_property(INCLUDE_OPENCL GLOBAL PROPERTY "INCLUDE_OPENCL_1_2" ) 
//显示INCLUDE_OPENCL 
MESSAGE(STATUS "INCLUDE_OPENCL :${INCLUDE_OPENCL}")

上面的例子可以看出这种方式相比方法一在使用变量时多了一步,先要将先调用get_property将这个property读取到一个变量中(variable)才能使用。

总结:

两种方法相比,从使用便利性角度,方法一好一些,但方法一将变量保存在CMakeCache.txt,需要读写CMakeCache.txt文件,目前没有发现别的副作用,但记住这个区别是有好处的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方法一 set:
  • 方法二 set_property/get_property:
  • 总结:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档