C++获取项目路径的两种方式详解

目录
  • 一、Cmake传参:适用于简单场景
  • 二、从环境变量读取:适合脚本场景
  • 组合实例代码:
  • 总结

在某些特定的条件运行时不能使用局部地址,例如ci流程等,这就要求读取文件时必需使用全局地址,但是在项目路径不定的情况下很难知道某个文件的全局地址,目前存在两种获取项目路径的方式,其中一种更适用于ci流程。

一、Cmake传参:适用于简单场景

在Cmake中,很容易知道项目的地址,例如

${PROJECT_SOURCE_DIR}

可以在cmakelists中,将该值赋值给变量,例如MAIN_PATH:

set(MAIN_PATH ${PROJECT_SOURCE_DIR})

然后新建xxx.h.in文件,仅需一行即可利用宏捕获MAIN_PATH:

#define PROJECT_PATH "@MAIN_PATH@"

在cmakelists中将xxx.h.in编译成xxx.h:

configure_file(src/param_deliver.h.in ../src/param_deliver.h)

编译完成后即可生成对应的xxx.h:

#define PROJECT_PATH "/home/type/mcamera/mcamera"

然后调用该宏即可获得项目地址。

二、从环境变量读取:适合脚本场景

C++中自带函数getenv,可以读取指定的环境变量,返回char *。详见std::getenv - cppreference.com。

因此,可以在bash中将当前项目地址设置为指定的环境变量,例如

export resource_path=${PWD}

注意,是${PWD}而不是${pwd}。

然后在c++代码直接读取即可:

char *path = getenv("resource_path");

不存在则为空。

组合实例代码:

首先读取环境变量,如果不存在则从Cmake里读取:

std::string getResourcePath() {
    char *path = getenv("RESOURCE_DIR");
    if (path != nullptr) {
        LOG("find path in ENV:%s", path);
        return path;
    }
    // not find in ENV
    std::string project_path = PROJECT_PATH;
    std::string resource_path = project_path + "/test/resource/";
    LOG("find path in CMake:%s", resource_path.c_str());
    return resource_path;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • linux C++ 获取文件绝对路径的实例代码

    提供ftp服务时需要获取文件绝对路径,这里记录一下. #include <stdlib.h> #include <stdio.h> #include <limits.h> int main(){ const char *file_name = "filename"; char abs_path_buff[PATH_MAX]; //获取文件路径, 填充到abs_path_buff //realpath函数返回: null表示获取失败; 否则返回指向ab

  • C\C++ 获取当前路径实例详解

    C\C++ 获取当前路径实例详解 获取当前工作目录是使用函数:getcwd.cwd指的是"current working directory",这样就好记忆了. 函数说明: 函数原型:char* getcwd(char* buffer, int len);     参数:buffer是指将当前工作目录的绝对路径copy到buffer所指的内存空间, len是buffer的长度.     返回值:获取成功则返回当前工作目录(绝对路径),失败则返回false(即NULL).     该函数

  • C++ 设置和获取当前工作路径的实现代码

    通常,你在服务程序中调用DLL,而DLL又会加载许多配置和文件,一般会出现DLL加载不到配置和文件,原因是你的服务程序被加载后,路径并不是你程序的所在目录,故DLL也不是,因此加载不了.解决办法,是在DLL的路径或服务程序中设计当前的工作路径. 主要函数为:SetCurrentDirectory: 设置当前工作路径实例如下: #include <iostream> #include <windows.h> #include <string> using namespac

  • C++获取项目路径的两种方式详解

    目录 一.Cmake传参:适用于简单场景 二.从环境变量读取:适合脚本场景 组合实例代码: 总结 在某些特定的条件运行时不能使用局部地址,例如ci流程等,这就要求读取文件时必需使用全局地址,但是在项目路径不定的情况下很难知道某个文件的全局地址,目前存在两种获取项目路径的方式,其中一种更适用于ci流程. 一.Cmake传参:适用于简单场景 在Cmake中,很容易知道项目的地址,例如 ${PROJECT_SOURCE_DIR} 可以在cmakelists中,将该值赋值给变量,例如MAIN_PATH:

  • springboot 注册服务注册中心(zk)的两种方式详解

    在使用springboot进行开发的过程中,我们经常需要处理这样的场景:在服务启动的时候,需要向服务注册中心(例如zk)注册服务状态,以便当服务状态改变的时候,可以故障摘除和负载均衡. 我遇到过两种注册的途径: 1.在Spring的webapplication启动完成后,直接进行注册: 2.在servlet容器启动完成后,通过listener进行注册. 本文通过一个demo讲述一下这两种注册方式,使用的是传统的向zk注册的方案. 1.Spring webapplication启动完成后注册 先上

  • RabbitMQ 实现延迟队列的两种方式详解

    目录 1. 用插件 1.1 安装插件 1.2 消息收发 2. DLX 实现延迟队列 2.1 延迟队列实现思路 2.2 案例 3. 小结 定时任务各种各样,常见的定时任务例如日志备份,我们可能在每天凌晨 3 点去备份,这种固定时间的定时任务我们一般采用 cron 表达式就能轻松的实现,还有一些比较特殊的定时任务,向大家看电影中的定时炸弹,3分钟后爆炸,这种定时任务就不太好用 cron 去描述,因为开始时间不确定,我们开发中有的时候也会遇到类似的需求,例如: 在电商项目中,当我们下单之后,一般需要

  • Python获取网络时间戳的两种方法详解

    目录 方法一 代码实现 调用方法 返回结果 方法二 代码实现 调用方法 返回结果 在我们进行注册码的有效期验证时,通常使用获取网络时间的方式来进行比对. 以下为获取网络时间的几种方式. 方法一 需要的时间会比较长,个别电脑上可能会出现不兼容现象 代码实现 def get_web_server_time(self, host_URL, year_str='-', time_str=':'): ''' 获取网络时间,需要的时间会比较长,个别电脑上可能会出现不兼容现象 :param host_URL:

  • Spring Bean属性注入的两种方式详解

    目录 属性注入概念 一.构造器注入 示例1 注意点 二.setter注入 示例2 三.如何选择注入方式 属性注入概念 Spring 属性注入(DI依赖注入)有两种方式:setter注入,构造器注入. 这个注入的属性可以是普通属性(基本数据类型与String等),也可以是一个引用数据类型(主要是对象),或者是一个集合(list.map.set等) 下表是属性注入bean标签中常用的元素 元素名称 描述 constructor-arg 构造器注入.该元素的 index 属性指定构造参数的索引(从 0

  • Android事件处理的两种方式详解

    安卓提供了两种方式的事件处理:基于回调的事件处理和基于监听的事件处理. 基于监听的事件处理 基于监听的事件处理一般包含三个要素,分别是: Event Source(事件源):事件发生的场所,通常是各个组件 Event(事件):事件封装了界面组件上发生的特定事件(通常就是用户的一次操作) Event Listener(事件监听器):负责监听事件源发生的事件,并对各种事件作出相应的响应 下面使用一个简单的案例介绍按钮事件监听器 布局文件就是简单的线性布局器,上面是一个EditText,下面是一个Bu

  • Node.js中参数传递的两种方式详解

    目录 参数传递方式 GET方式 POST方式 动态网页 参数传递方式 在Node.js中,参数传递常见的共两种方式: GET方式:通过地址栏键=值的方式进行传递. POST方式:通过表单的方式传递请求数据. GET方式 GET方式通常是在请求地址中以[?参数1=值1&参数2=值2]的格式进行传递,在Node.js中可以通过获取url然后进行获取参数,如下所示: //1.引入http模块 var http = require('http'); //2.创建服务 var server = http.

  • IOS 指纹识别两种方式详解及实例

    IOS 指纹识别两种方式详解及实例 首先引入类名: #import <LocalAuthentication/LocalAuthentication.h> 然后在实现指纹识别的地方放入如下代码: 方式一: LAContext *lacontext = [[LAContext alloc]init]; // 判断设备是否支持指纹识别 BOOL isSupport = [lacontext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWit

  • 对Python使用mfcc的两种方式详解

    1.Librosa import librosa filepath = "/Users/birenjianmo/Desktop/learn/librosa/mp3/in.wav" y,sr = librosa.load(filepath) mfcc = librosa.feature.mfcc( y,sr,n_mfcc=13 ) 返回结构为(13,None)的np.Array,None表示任意数量 2.python_speech_features from python_speech_

  • mapper接口注入两种方式详解

    这篇文章主要介绍了mapper接口注入两种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.使用模板方式: <!--使用模板类实现mybatis --> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFacto

随机推荐