【发布时间】:2021-12-19 03:15:56
【问题描述】:
__FILE__ 给出绝对路径(用 make 构建)或相对路径(用 ninja 构建)。这是一个简单的测试器:
#include <iostream>
int main(int argc, char *argv[]) {
std::string thisFile = __FILE__;
std::cout << "thisFile = " << thisFile << "\n";
return 0;
}
这是同样简单的CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(file_test)
add_executable(app main.cpp)
如果我在build 目录中,我将输入cmake .. 或cmake -GNinja ..(我还尝试过在命令行上明确说明使用哪个c++ 编译器和-D 参数- 结果不变)。
如果我使用 ninja 构建,app 的输出是:
thisFile = ../main.cpp
如果我使用 make 构建,app 的输出是:
thisFile = /home/myname/sandbox/cmake/main.cpp
我已经在 Ubuntu 和 Pop!OS 上尝试过 - 结果相同。
有没有人知道如何让 ninja 构建的行为与 make 构建的行为方式相同?
【问题讨论】:
-
您的问题的答案是:是的。 (可能
__FILE__设置为作为参数传递给编译器以编译源文件的任何内容。) -
显然我问错了问题。为什么 cmake 会创建向编译器提供不同参数的构建文件?
-
为什么不呢?编译器必须能够找到要编译的文件。因此,(以及许多其他应用程序)您可以选择相对或绝对文件路径。看来你不能依赖任何东西。 - 我曾经注意到我在 VS2013 中使用 x86 获得绝对文件路径,而使用 x64 获得相对文件路径(反之亦然)。 (或者是VS2008?这是不久前。我忘了...);-)
-
如果您确实需要绝对或相对文件路径,您可能需要添加一些额外的操作(也许,甚至在应用程序本身的自定义代码中)。您可以传递源代码文件目录。作为一个宏(由您自己在构建脚本的命令行中定义)并处理
__FILE__和该宏,以便在必要时将一个转换为另一个。std::filesystem肯定会有所帮助。 AFAIR,你甚至不能指望规范化的文件路径,即我曾经在我的例如“蹦床”路径中看到过。类似./src/../build/file.cc。但是,再次:使用std::filesystem轻松修复...
标签: c++ cmake c-preprocessor ninja