cmake配置c++可调用的文件路径参数
一、目的
在程序中使用一个路径配置,因为在svn服务器的测试数据,测试数据成为了本地路径,在程序中使用了绝对路径来处理文件的输入,这个令人头疼啊。
每次下完代码,我得挨个地方去找,谁在用本地路径,有点绝对路径为:e:\data\test\1.img. 我只好一个个改动代码,因为我没有E盘啊。
故此,由cmake来实现自动配置一个相对路径,在代码中使用一个宏定义来作为大家的基础路径,这样代码下到本地,编译就可以运行了,
不用再一个个改让人恼火的路径,变量了。
二、实现
其实,不难,但是对于新手来说,百度半天,结合其他开源的项目的cmake方法,发现,其他很简单。两句话搞定。
1. 首先,在同级目录的cmake中,添加下面的代码。
SET(RW_DATA_PATH "${PROJECT_SOURCE_DIR}/data" CACHE PATH "root path")
configure_file (
"${PROJECT_SOURCE_DIR}/rw_config.h.in"
"${PROJECT_SOURCE_DIR}/include/rw_config.h"
)
在cmake工具中就可以查找到当前的路径项目了。
我的路径为:D:/RealWorldBackup/2014-05-08/rw_runtime/,你的是你自己的cmake文件路径下的data文件夹,当然,标出颜色的,就是变量名称,名称在代码中还有用到。
2. 接着,我定义了一个头文件,此文件名称为:rw_config.h.in,in结尾,其他还是头文件一个,此文件记得要让cmake能找的到啊,我就放在了当前CMakeLists.txt的同一路径下了。
如下:
#ifndef __rw_config_h__
#define __rw_config_h__ #include "rw_types.h" #if defined(WIN32)
#define rw_export __declspec(dllexport)
#define rw_import __declspec(dllimport)
#define rw_local #ifndef __win__
#define __win__
#endif
#else
#define rw_export __attribute__ ((visibility ("default")))
#define rw_import __attribute__ ((visibility ("default")))
#define rw_local __attribute__ ((visibility ("hidden"))) #ifndef __linux__
#define __linux__
#endif
#endif #define rw_api rw_export #define rw_data_path "@RW_DATA_PATH@" #endif
3. 说明:
其他都不重要,但是标出颜色的,是个替换过程。你输入的变量RW_DATA_PATH会configure_file拷贝出一个头文件,名字为rw_config.h过程中,进行替换,替换出来结果为:你在cmke中输入的路径变量。
我把拷贝后的rw_config.h放在了当前目录下的include目录下。内容如下:
#ifndef __rw_config_h__
#define __rw_config_h__ #include "rw_types.h" #if defined(WIN32)
#define rw_export __declspec(dllexport)
#define rw_import __declspec(dllimport)
#define rw_local #ifndef __win__
#define __win__
#endif
#else
#define rw_export __attribute__ ((visibility ("default")))
#define rw_import __attribute__ ((visibility ("default")))
#define rw_local __attribute__ ((visibility ("hidden"))) #ifndef __linux__
#define __linux__
#endif
#endif #define rw_api rw_export #define rw_data_path "D:/RealWorldBackup/2014-05-08/rw_runtime/data" #endif
此时的宏定义为rw_data_path 就是一个字符串的文件路径名称了。
只要包含此头文件,就可以在任何地方使用这个相对路径了。
当然我是把他做了字符串来处理的,你也可以把双引号去掉。反正宏就是赤裸裸的替换,就看你打算干什么了。
这样大家把工程的相对目录给弄对了, 把数据统一的放在某个相对位置,就不用受各种测试,而造成自己很爽,别人恼火的测试数据和测试代码的问题了。
至此,全部搞定了。你可以使用当然变量了,不用再纠结与绝对路径的困扰。
当然你也可以用他完成其他你想要的东西,看你咋想了。
Cmake还是挺厉害的。
若有问题,请不吝指教啊!
cmake配置c++可调用的文件路径参数的更多相关文章
- eclipse debug configurations arguments指定文件路径参数
1 eclipse debug configurations arguments指定文件路径参数 使用绝对路径,但是这个文件必须要放在该project的源码路径的外面才行,否则eclipse不认这个文 ...
- springmvc笔记(基本配置,核心文件,路径,参数,文件上传,json整合)
首先导入jar包 大家注意一下我的springmvc,jackson,common-up的jar包版本.其他版本有可能出现不兼容. src文件: webroot目录: web.xml <?xml ...
- 配置windows批处理脚本(.bat)文件路径 | window批处理文件配置执行路径
以PHP的composer为例 1 . 路径D:\phpStudy\php\php-5.5.38加入环境变量 2.在路径D:\phpStudy\php\php-5.5.38新建composer.bat ...
- C#调用DLL文件时参数对应表
Wtypes.h中的非托管类型 非托管 C语言类型 托管类名 说明HANDLE void* Syste ...
- Django框架之模板路径及静态文件路径配置
内容: (1)模板文件路径的配置 (2)静态文件路径的配置 一.模板文件路径的配置 模板文件主要通过jinja2模板进行渲染html页面,实现动态页面. 步骤一:创建一个template的文件夹,用于 ...
- nginx root&alias 文件路径配置
nginx 指定文件路径有两种方式 root 和 alias,root 与 alias 主要区别在于 nginx 如何解释 location 后面的 uri,这会使两者分别以不同的方式将请求映射到服务 ...
- log4net日记文件路径动态配置
在项目开发过程中,部署的服务器越来越多,查看日记的时候需要每台服务器去找日记看,这对运维人员来说是一个很不友好的方式.在此基础上就提出将所有日记统一到一台服务器上进行存放,并按照产生日记的服务器分文件 ...
- nginx root&alias文件路径配置
转:https://www.ttlsa.com/nginx/nginx-root_alias-file-path-configuration/ 总结: alias 改变了访问路径.root对应loca ...
- nginx root && alias 文件路径配置
文章摘自:http://www.ttlsa.com/nginx/nginx-root_alias-file-path-configuration/ nginx指定文件路径有两种方式root和alias ...
随机推荐
- .net运行项目的几种形式
1.通过配置IIS 2.通过VS运行项目 3.发布到测试服务器 不同于PHP的发布,直接把相关的类文件传入ftp即可. .net的发布是编译好dll文件,将dll文件传入即可. 比如改了某个文件,就把 ...
- git 版本管理工具说明
$ git init (初始化本地仓库,会生成.git 文件夹 .git 文件夹里存储了所有的版本信息.标记等内容) $ git add . ...
- C# 开发 —— 数组类对象接口
数组类型是从抽象基类 Array 派生的引用类型,通过new运算符创建数组并将数组元素初始化为他们的默认值 一维数组 type[] arrayname; 数组的长度不是声明的一部分,而且数组必须在访问 ...
- [React] Create a queue of Ajax requests with redux-observable and group the results.
With redux-observable, we have the power of RxJS at our disposal - this means tasks that would other ...
- worktools-git 工具的使用总结(2)
1.创建分支 git branch son parent //创建分支,是在master 分支的基础上创建 :~/myGit$ git st # On branch master nothing to ...
- 【Codeforces Round #451 (Div. 2) D】Alarm Clock
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 尺取法+二分. 类似滑动窗口. 即左端点为l,右端点为r. 维护a[r]-a[l]+1总是小于等于m的就好. (大于m就右移左端点) ...
- ArcGIS 点要素新增点
IFeatureLayer layer = FrmMain.m_mapControl.get_Layer(0) as IFeatureLayer; IFeatureClass featureClass ...
- 在 Android* 商务应用中实施地图和地理围栏特性
摘要 本案例研究讨论了怎样将地图和地理定位特性构建到 Android* 商务应用中.包含在 Google Maps* 上覆盖商店位置,以及在设备进入商店地理围栏邻近区域时借助地理围栏通知用户. 文件夹 ...
- Activity Test1
源代码下载(免积分) :下载 Acitivty測试的API的父类是InstrumentationTestCase.这个类可以获取Instrumentation.来操作Activity. 对于acti ...
- wechat4j框架具体解释
发送消息: 基于上面access_token的逻辑,在构造发送消息对象的时候请依照例如以下代码. wechat4j和微信强力推荐的方法 CustomerMsg customerMsg = new Cu ...