gcc/g 定义的替代方案

gcc/g++ alternative to defines

本文关键字:方案 定义 gcc      更新时间:2023-10-16

我正在为我的项目使用cmake构建系统。

我希望我的程序可以始终了解项目目录,我以为我可以设置一个环境变量并使用:

getenv("MYPROJDIR")

,但我不想在整个系统上创建一个持久变量,并且我不想在执行程序之前每次手动创建一个临时变量。

是否可以在构建时间设置一些变量,以便我的源知道项目目录,并且可以相对于该目录访问输入文件,而不管位置执行的位置如何。

我可以使用-D开关或:

使用定义
add_definitions(-DMYPROJDIR=${PROJECT_SOURCE_DIR})

,但我听说人们说除非绝对必要,否则人们说不要使用宏。

总的来说,我需要这种娱乐性:

const string defaultinput = MYPROJDIR + "src/someinputdata.dat"
ifstream myfile(defaultinput)

,但我听说人们说除非绝对 必要。

即使那是真的,我不会说使用-D开关是宏。

使用-D开关恰恰是为此,将构建时间变量添加到您的代码中。这是您似乎想要的。

定义的替代方法取决于您的用例。构建/编译时间的最明显替代方法是运行时间决策。

,就您而言,我认为将通往程序目的地的绝对路径本身放入您的程序本身是一个好主意(请参阅@Sergeya评论)。

我会推荐以下两个运行时解决方案之一:

  1. 如果这确实是需要成为应用程序的一部分的数据(硬编码1:1关系),那么我可能会直接将src/someinputdata.dat的内容编译到您的程序中

    • c/c ,您可以#include一个文件字符串吗?
    • 用cmake在标题中烘烤二进制
  2. 通过某些程序代码获取可执行文件的路径

    • 如何获取程序路径
    • 我如何获得程序正在运行的目录?