一、目的

在程序中使用一个路径配置,因为在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++可调用的文件路径参数的更多相关文章

  1. eclipse debug configurations arguments指定文件路径参数

    1 eclipse debug configurations arguments指定文件路径参数 使用绝对路径,但是这个文件必须要放在该project的源码路径的外面才行,否则eclipse不认这个文 ...

  2. springmvc笔记(基本配置,核心文件,路径,参数,文件上传,json整合)

    首先导入jar包 大家注意一下我的springmvc,jackson,common-up的jar包版本.其他版本有可能出现不兼容. src文件: webroot目录: web.xml <?xml ...

  3. 配置windows批处理脚本(.bat)文件路径 | window批处理文件配置执行路径

    以PHP的composer为例 1 . 路径D:\phpStudy\php\php-5.5.38加入环境变量 2.在路径D:\phpStudy\php\php-5.5.38新建composer.bat ...

  4. C#调用DLL文件时参数对应表

    Wtypes.h中的非托管类型  非托管 C语言类型    托管类名               说明HANDLE                  void*               Syste ...

  5. Django框架之模板路径及静态文件路径配置

    内容: (1)模板文件路径的配置 (2)静态文件路径的配置 一.模板文件路径的配置 模板文件主要通过jinja2模板进行渲染html页面,实现动态页面. 步骤一:创建一个template的文件夹,用于 ...

  6. nginx root&alias 文件路径配置

    nginx 指定文件路径有两种方式 root 和 alias,root 与 alias 主要区别在于 nginx 如何解释 location 后面的 uri,这会使两者分别以不同的方式将请求映射到服务 ...

  7. log4net日记文件路径动态配置

    在项目开发过程中,部署的服务器越来越多,查看日记的时候需要每台服务器去找日记看,这对运维人员来说是一个很不友好的方式.在此基础上就提出将所有日记统一到一台服务器上进行存放,并按照产生日记的服务器分文件 ...

  8. nginx root&alias文件路径配置

    转:https://www.ttlsa.com/nginx/nginx-root_alias-file-path-configuration/ 总结: alias 改变了访问路径.root对应loca ...

  9. nginx root && alias 文件路径配置

    文章摘自:http://www.ttlsa.com/nginx/nginx-root_alias-file-path-configuration/ nginx指定文件路径有两种方式root和alias ...

随机推荐

  1. js防止提交数据之后的按钮连击

    js防止提交数据之后的按钮连击 一.实例描述 当页面提交的数据特别多时,页面会反应比较迟钝,此时如果用户等不及而连续单击按钮,导致数据重复提交.本案例就是为了防止数据重复提交. 二.截图 三.代码 & ...

  2. 【Pycharm】【HTML】注释问题

    学习HTML中,遇到的注释前存在空行的问题: 只要找到Pycharm设置中:勾选去掉即可

  3. SpringMVC框架中的异常解析器-ExceptionHandler和HandlerExceptionResolver

    SpringMVC框架中,处理异常还是挺方便的,提供了一个异常解析器. 处理局部异常 @Controller public class AccessController { /** * 处理这个Con ...

  4. C++中的纯虚函数

    ---恢复内容开始--- 在C++中的一种函数申明被称之为:纯虚函数(pure virtual function).它的申明格式如下 class CShape { public: ; }; 在什么情况 ...

  5. 高速数论变换(NTT)

    今天的A题.裸的ntt,但我不会,于是白送了50分. 于是跑来学一下ntt. 题面非常easy.就懒得贴了,那不是我要说的重点. 重点是NTT,也称高速数论变换. 在非常多问题中,我们可能会遇到在模意 ...

  6. HDU 1166 敌兵布阵 Segment Tree题解

    本题是最主要的分段树操作了.或者一般叫线段树,只是好像和线段没什么关系,仅仅是分段了. 不使用lazy标志,更新仅仅是更新单点. 假设不使用分段树,那么更新时间效率仅仅须要O(1),使用分段树更新效率 ...

  7. ReactNavtive框架教程(4)

    开头的响应码, 这些代码都很实用. 比如202 和 200表示返回一个推荐位置的列表.当完毕这个实例后.你能够尝试处理这些返回码.并将列表提供给用户选择. 保存,返回模拟器,按下Cmd+R ,然后搜索 ...

  8. Linux启动(续)

    runlevel (启动级别):    查看命令 :who -r 或 runlevel         0:halt 关机         1:单用户模式,直接以管理员身份登录,不需要密码       ...

  9. MockServer jar包安装

    github地址: https://github.com/jamesdbloom/mockserver 1. org.apache.maven.plugin-tools:maven-plugin-an ...

  10. Redis .Net客户端源码

    1.简单介绍 当前NoSql使用已经极为普遍,无论是Java生态圈,还是.net生态圈.大大小小的Web站点在追求高性能高可靠性方面,不由自主都选择了NoSQL技术作为优先考虑的方面.主流的技术有:H ...