msys2 下的 gcc 和 clang 无法解析包含绝对路径

gcc and clang under msys2 cannot resolve includes with absolute paths

我尝试获取由在 mysys2 管理的 MinGW 环境下工作的 cxxtest 框架生成的测试。该工具生成具有绝对路径的 C++ 文件。但是,gcc 似乎无法解析这个绝对路径。

这是一个演示问题的最小示例:

// file1.h
#include <iostream>
inline void hallo() { std::cout << "Hallo\n"; }
// main.cpp
#include "/home/phil/example/file1.h"

int main()
{
  hallo();
  return 0;
}

文件存在(至少msys2 shell解析路径):

$ ls /home/phil/example/file1.h
/home/phil/example/file1.h

...但调用 g++ 会导致此错误:

$ g++ main.cpp
main.cpp:1:38: fatal error: /home/phil/example/file1.h: No such file or directory
 #include "/home/phil/example/file1.h"
                                      ^
compilation terminated.

与 clang 相同的错误。

在完整的 Linux 环境下,该示例有效。如果我用相对路径 (#include "file1.h") 替换绝对路径,它也有效。

因此,我认为问题出在 Windows 之上负责解析路径的层。不确定我是否应该将它作为错误报告给 msys2 项目,或者它是否是一个已知问题。如果这是一个已知问题,是否有任何解决方法(例如设置 -I 选项)?

(如果可能,我想避免替换绝对路径,因为它们在 cxxtest 框架生成的代码中。从技术上讲,运行对生成的文件执行后处理步骤是可能的,但似乎就像长 运行.)

中的黑客一样

由于您是使用 MinGW-w64 作为其运行时环境的 运行 编译器,因此他们无法识别这样的 POSIX 风格的路径。我认为他们实际上将根目录“/”解释为 "C:\"。除此之外,他们只会识别原生 Windows 风格的路径。

我建议您将参数 -I/home/phil/example 从 msys-2 中的某个程序 运行 传递给编译器。0.dll POSIX 仿真运行时环境(例如 /usr/bin/bash 或 /usr/bin/make)。 msys-2.0.dll 运行时会将该参数转换为使用本机 Windows 路径,以便编译器可以理解它,并且像 #include <file1.h> 这样的语句将起作用。或者,您可以尝试在源代码中放置一个 Windows 样式的路径,例如路径应以 C:\.

开头

但是请注意,在源代码或构建脚本中使用绝对路径不是一个好主意,因为这会使在不同计算机上构建代码变得更加困难。您可以考虑使用环境变量或相对路径。

尝试使用 Cygwin 作为软件包提供的 MinGW 编译器。 (换句话说,忘记 MSYS 环境;在 Cygwin 下工作,但像以前一样以 MinGW 风格构建代码。)

那么你应该能够包含引用/home/phil;它只会解析为 C:\Cygwin\home\phil 或您的 Cygwin 根所在的任何位置。

实际上,在 MSYS 下也有可能(毕竟,它只是 Cygwin 的旧版本的后代)。你只需要弄清楚 /home/phil 指的是什么,创建那棵树并在那里工作。