码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C/C++ 代码中使用 CMake 工程目录


    C/C++ 代码中使用 CMake 工程目录

    文章目录

    • C/C++ 代码中使用 CMake 工程目录
      • 使用原因
      • 如何使用
      • 参考链接

    使用原因

    在 C++ 代码中获取工程路径有点繁琐,因为如果生成的可执行文件(.exe) 位置与工程目录不同,则当前的路径为运行时的路径,可能需要通过很多的 ../.. 来定位到工程目录,甚至由于权限问题运行目录在 C 盘系统路径,以及由于迭代更新生成路径发生变化…

    如果调试使用工程路径下的文件,比如配置文件时,在每次修改配置文件后,都需要将配置文件进行拷贝更新到运行目录下才能调试,虽然 CMake 也提供指令用于拷贝文件(如 file),但依旧很繁琐。

    关于获取当前目录的方法有

    • 包含 Windows.h , 调用 GetModuleFileName(nullptr, buffer, sizeof(char) * szBuff),buffer 内容即为当前目录路径, (Win 平台)
    • 包含 direct.h, 调用 char* _getcwd(char* buffer, size_t length) 方法, (Win 平台)
    • 包含 unistd.h ,调用 getcwd(char* buffer, size_t length) 方法,(Linux 平台)
    • …

    如何使用

    需要用到 CMake 中的变量 PROJECT_SOURCE_DIR,此变量的内容为当前目录或其父目录范围中最后一次调用 project() 命令的 CMakeLists.txt 所在目录。

    在工程只有一个单一目录时,也可以使用 CMAKE_CURRENT_SOURCE_DIR,或 CMAKE_SOURCE_DIR 变量

    CMAKE_CURRENT_SOURCE_DIR 与 CMAKE_SOURCE_DIR 的区别:

    变量名概述
    CMAKE_CURRENT_SOURCE_DIR当前 CMakeLists.txt 所在的目录
    CMAKE_SOURCE_DIR最外层的 CMakeLists.txt 所在的目录

    由于单一目录通常只有一个 CMakeLists.txt 文件,所以此处无差别。

    首先来创建一个简单的 CMakeLists.txt

    # 设置 CMake 最低版本要求
    cmake_minimum_required(VERSION 3.0)
    
    # 设置使用 C++ 标准为 C++17
    set(CMAKE_CXX_STANDARD 17)
    
    # 创建工程,设置工程名称 CMakeTest
    project(CMakeTest)
    
    # 规定头文件的包含路径
    include_directories(${PROJECT_SOURCE_DIR})
    
    # 生成可执行文件 只包含一个 main.cpp 文件
    add_executable(${PROJECT_NAME} main.cpp)
    
    # 创建我们的宏 PROJECT_PATH
    add_definitions(-DPROJECT_PATH="${PROJECT_SOURCE_DIR}")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    注意:

    1. cmake 变量两边的双引号 (") 一定要加,否则不为字符串,在生成时出现问题。
    2. 双引号不需要使用反斜杠 (\) 标识转义,\" 在 CMakeLists.txt 中与 " 等价。
    3. cmake 变量使用需要加上花括号,并前置 $ 符号

    然后写主 cpp 文件

    #include 
    #include 
    
    int main(int argc, char* argv[])
    {
    	std::string path(PROJECT_PATH);
    	std::cout << "project path:" << path << std::endl;
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在同一目录下创建 build 目录,用于创建 CMake 生成文件和工程文件等。接下来生成工程

    cd build
    cmake ..
    
    • 1
    • 2

    使用 Visual Studio 打开 build 目录下的 .sln文件 (解决方案文件 Solution),此时将鼠标放在宏上方即可看到此宏已被扩展为了 PROJECT_SOURCE_DIR 的内容

    在这里插入图片描述
    此时运行,则会打印

    project path:D:/WorkSpace/CMakeTest
    
    • 1

    见图 在这里插入图片描述

    参考链接

    • CMake 官网 PROJECT_SOURCE_DIR 变量https://cmake.org/cmake/help/latest/variable/PROJECT_SOURCE_DIR.html#variable:PROJECT_SOURCE_DIR
    • CMake 官网 cmake 变量
      https://cmake.org/cmake/help/latest/manual/cmake-variables.7.html
  • 相关阅读:
    python标识符
    Taurus.MVC 微服务框架 入门开发教程:项目部署:5、微服务应用程序发布到Docker部署(下)。
    【数据结构】建立二叉树以及哈夫曼树及哈夫曼编码
    【论文解读】GPT Understands, Too
    【CV知识点扫盲】|激活函数篇
    【web】java多线程(吐血万字超详解)
    uni-app下,页面跳转后wacth持续监听的问题处理
    基于SSM的汽车销售管理系统
    一个低级错误导致的诡异现象——走近科学能拍三集,(C语言)最简单的数组元素读取,不正确!?
    流量抓取工具(wireshark)
  • 原文地址:https://blog.csdn.net/weixin_44488341/article/details/132814321
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号