2016-12-29 79 views
0

我正在为我的项目使用CMake构建系统。gcc/g ++替代定义

我希望我的可执行程序,以了解项目目录在任何时候, 我以为我可以设置环境变量和使用:

getenv("MYPROJDIR") 

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

是否有一种方法可以在构建时设置一些变量,以便我的源知道项目目录,并且可以访问与该目录相关的输入文件,而不管它执行的位置。

我可以用一个与-D开关定义或:

add_definitions(-DMYPROJDIR=${PROJECT_SOURCE_DIR}) 

,但我听到有人说不能使用宏,除非绝对必要的。

总的来说,我需要这个funtionality:

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

你的情况,你可以在一些资源的配置文件与不同对名,值。并放置你想要的项目目录。另一种可能性是将此路径作为参数传递给您的应用程序 – johngull

+0

宏在这里并不是一个坏主意。但是如果你想要更多的灵活性,你可以在运行时查找可执行文件的路径,并加载你的数据文件。这意味着你可以将两个目录都移动到另一个目录并保持工作。 – Olivier

+0

确实是一个糟糕的主意。将应用程序部署或复制到其他计算机时,您会做什么?它如何知道如何访问这台新机器上的文件? – SergeyA

回答

2

,但我听到有人说不能使用宏,除非绝对必要 。

即使这将是真实的,我不会说使用-D开关是一个宏。

使用-D开关正是为了这个目的,为您的代码添加构建时变量。这似乎是你想要的。

+1

@Vikash没有比这更好的方法了。如果这是少数使用这种功能的用例之一,那么我也会使用'-D'。但是,如果有相当多的配置参数(比如20),那么从长远来看,由CMake配置的配置头将是更好的选择。 – everclear

0

定义的替代取决于您的使用情况。构建/编译时最明显的选择是运行时决策。

在你的情况下,我不认为把程序目的地的绝对路径放入你的程序本身是一个好主意(请参阅@SergeyA评论)。

我建议以下两种运行时的解决方案之一:

  1. 如果这真的是一个需要你的应用程序的一部分数据(硬编码的1:1间的关系),那么我会可能直接编译的src/someinputdata.dat内容到你的程序

  2. 通过一些程序代码,让您的可执行文件的路径