cmake:在各级子项目(目录)之间共享变量
来源:互联网 发布:尚趣玩网络武神赵子龙 编辑:程序博客网 时间:2024/06/06 04:07
项目目录结构如下图,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能使用这些变量。
├─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中定义一个变量
set(ICD_LIBRARY "${PROJECT_BINARY_DIR}/lib" CACHE INTERNAL "ICD Library location" )//"ICD Library location"这个字符串相当于对变量的描述说明,不能省略,但可以自己随便定义
在facedetect下的CMakeLists.txt中读取这个一个变量
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
set_property(GLOBAL PROPERTY INCLUDE_OPENCL_1_2 "${CMAKE_CURRENT_LIST_DIR}/include/1.2" )
在facedetect下的CMakeLists.txt中读取这个一个property
//先调用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
文件,目前没有发现别的副作用,但记住这个区别是有好处的。
- cmake:在各级子项目(目录)之间共享变量
- 在Exe和Dll之间共享变量
- VC++入门:在变量之间共享内存
- 在多个Activity之间共享变量
- Java web (学习笔记2)项目各级目录
- 在多个的共享ndk项目之间共享模块
- Crystal Reports使用共享变量实现主报表及子报表之间的数据共享
- 使用共享变量实现主报表及子报表之间的数据共享
- 使用共享变量实现主报表及子报表之间的数据共享
- 使用NFS在linux之间共享目录与文件
- Linux之间实现目录共享
- docker容器之间共享目录
- docker容器之间共享目录
- 由路径创建各级目录
- CMake test目录和项目同名错误
- 项目之间Cookie的共享
- 项目之间Cookie的共享
- 关于在 Windows 和 VMware workstation 之间实现共享目录的问题
- Error -27727: Step download timeout (120 seconds) has expired when downloading resource(s).
- oracle函数trunc的使用
- 关于Spring与mybatis整合无法读取配置文件的问题
- 用Node.js操作Firebird数据库。
- HDU【2203】亲和串
- cmake:在各级子项目(目录)之间共享变量
- 机器学习
- initMouseEvent
- NetworkingTool
- android 快速开发不可或缺的12个工具类
- Machine Learning结课感想
- wireshark mac版 interface网卡列表为空
- Java——刷题,考点,难点,查漏补缺
- Socket编程