我正在为我的项目使用CMake构建系统。
我希望我的程序可执行文件始终知道项目目录, 我以为我可以设置一个环境变量并使用:
add_definitions(-DMYPROJDIR=${PROJECT_SOURCE_DIR})
但是我不希望在整个系统中创建一个持久变量,我不想在每次执行程序之前手动创建一个临时变量。
有没有办法在构建时设置一些变量,以便我的源知道项目目录,并且可以访问相对于该目录的输入文件,而不管它的执行位置。
我可以使用带-D开关的define或:
const string defaultinput = MYPROJDIR + "src/someinputdata.dat"
ifstream myfile(defaultinput)
但我听说有人说除非绝对必要,否则不要使用宏。
总的来说,我需要这个功能:
var scanPage = new ZXingScannerPage();
scanPage.OnScanResult += (result) => {
// Stop scanning
scanPage.IsScanning = false;
// Pop the page and show the result
Device.BeginInvokeOnMainThread(async () => {
// await Navigation.PopAsync();
await Navigation.PushModalAsync(new Pages.DataGridPage(PladsId));
});
};
答案 0 :(得分:2)
但我听说有人说除非绝对使用宏 必要的。
即使这是真的,我也不会说使用-D
开关是一个宏。
使用-D
开关正是为了这个,将构建时变量添加到代码中。这就是你想要的。
答案 1 :(得分:0)
定义的替代方案取决于您的用例。构建/编译时最明显的替代方案是运行时决策。
在你的情况下,我不认为将程序目的地的绝对路径放入你的程序本身是个好主意(参见@SergeyA评论)。
我建议使用以下两种运行时解决方案之一:
如果这确实是需要成为应用程序一部分的数据(硬编码的1:1关系),那么我可能会直接将src/someinputdata.dat
的内容编译到您的程序中
通过一些程序代码获取可执行文件的路径