gcc и clang под msys2 не могут разрешить включения с абсолютными путями

Я пытаюсь получить тесты, сгенерированные средой cxxtest, работающей в среде MinGW, управляемой mysys2. Инструмент генерирует файлы 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 разрешает путь):

$ 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.

Та же ошибка с лязгом.

В полной среде Linux пример работает. Это также работает, если я заменяю абсолютный путь относительным (#include "file1.h").

Итак, я предполагаю, что проблема заключается в слое над Windows, который отвечает за разрешение путей. Не уверен, стоит ли сообщать об этом как об ошибке в проекте msys2, или это известная проблема. Если это известная проблема, есть ли обходные пути (например, настройка -I опции)?

(Если возможно, я бы хотел избежать замены абсолютных путей, так как они находятся в сгенерированном коде с помощью фреймворка cxxtest. Технически, выполнение шага постобработки для сгенерированных файлов было бы возможным, но в долгосрочной перспективе это похоже на хак.)

1

Решение

Поскольку вы используете компиляторы, которые используют MinGW-w64 в качестве среды выполнения, они не распознают пути в стиле POSIX. Я думаю, что они на самом деле интерпретируют корневой каталог «/» как «C: \». Помимо этого, они будут распознавать только собственные пути в стиле Windows.

Я рекомендую вам передать аргумент -I/home/phil/example в ваш компилятор из какой-либо программы, работающей в среде выполнения эмуляции POSIX msys-2.0.dll (например, / usr / bin / bash или / usr / bin / make). Затем среда выполнения msys-2.0.dll преобразует этот аргумент в собственный путь Windows, чтобы компилятор мог его понять, и такие операторы, как #include <file1.h> буду работать. В качестве альтернативы вы можете попробовать добавить путь в стиле Windows в исходный код, например, путь должен начинаться с C:\,

Однако обратите внимание, что иметь абсолютные пути в исходном коде или скриптах сборки — плохая идея, так как это усложняет сборку кода на другом компьютере. Вы можете рассмотреть возможность использования переменных среды или относительных путей.

3

Другие решения

Попробуйте использовать компилятор MinGW, который Cygwin предоставляет в виде пакета. (Другими словами, забудьте о среде MSYS; работайте под Cygwin, но постройте код, как и раньше, в стиле MinGW.)

Тогда вы должны иметь возможность включать ссылки /home/phil; это просто разрешит C:\Cygwin\home\phil или где ваш корень Cygwin.

На самом деле, это может быть возможно и при MSYS (который, в конце концов, просто потомок старого от Cygwin). Вы просто должны выяснить, что /home/phil имеет в виду, создать это дерево и работать там.

0

По вопросам рекламы [email protected]