__FILE__在使用CMake/nija构建时给出的结果与使用CMake/make构建时不同



__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-同样的结果。

有人知道一种方法可以让忍者的构建像make构建一样表现吗?

有人知道一种方法可以让忍者版本以与make版本相同的方式运行吗?

使用CMake 3.21,3.21发行说明:

Ninja生成器现在使用绝对路径将源文件和包含目录传递给编译器。这使得诊断消息和调试符号更加一致,并与Makefile生成器相匹配。

或者,围绕编译器编写一个包装脚本。这样的脚本将解析编译器选项并提取源文件路径,并将相对路径更改为绝对路径,然后用绝对路径调用编译器。将该包装器传递给带有CMAKE_CXX_COMPILER_LAUNCHER的CMake以启动脚本。

或者,在CMake中迭代要编译的每个文件,在CMoke中提取一个带有get_filename_component的文件的完整路径,然后在该文件上使用set_source_file_properties添加COMPILE_DEFINITION(如ABSFILE=${the_absolute_path_to_that_file}(,并在源文件中使用该编译定义作为完整路径。我认为,可能取决于编译器,您也可以用这种方式覆盖__FILE__

最新更新