__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__
。