gcc / g ++替代定义

时间:2016-12-29 15:20:48

标签: c++ cmake g++

我正在为我的项目使用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));

                        });
                    };

2 个答案:

答案 0 :(得分:2)

  

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

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

使用-D开关正是为了这个,将构建时变量添加到代码中。这就是你想要的。

答案 1 :(得分:0)

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

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

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

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

  2. 通过一些程序代码获取可执行文件的路径