Включить изменение пути заголовка с Windows на Linux - PullRequest
9 голосов
/ 21 февраля 2009

Я портирую приложение, написанное на C ++, из Windows в Linux. У меня есть проблема с путем заголовка файлов. Windows использует \, а Linux использует /. Я считаю трудным изменить это в каждом исходном файле и файле заголовка. Есть ли какая-то работа вокруг?

Ответы [ 6 ]

26 голосов
/ 21 февраля 2009

Всегда используйте прямые косые черты в путях #include. Задача компилятора - сопоставить путь с любой схемой слеша / директории, поддерживаемой базовой ОС.

10 голосов
/ 21 февраля 2009

Вы, люди! Да , вы можете и должны всегда использовать косую черту. Я думаю, проблема в том, как получить там из здесь !

Если у вас установлен Perl, следующий лайнер преобразует исходный файл C ++ для использования прямой косой черты, сохраняя оригинальную версию в файле с расширением .bak:

perl -i.bak -pe "tr!\\!/! if /^\s*#\s*include\b/" myfile.cpp

(приведенная выше командная строка предназначена для Windows; если вы используете Linux или другую Unix-подобную оболочку, используйте одинарные кавычки вокруг третьего параметра вместо двойных кавычек.)

Если у вас есть куча файлов, которые необходимо преобразовать, скажите, что все файлы заканчиваются на .cpp:

for %f in (*.cpp) do perl -i.bak -pe "tr!\\!/! if /^\s*#\s*include\b/" %f

Соответствующая команда для среды оболочки Bourne (типичная оболочка Linux):

for f in *.cpp; do perl -i.bak -pe 'tr!\\!/! if /^\s*#\s*include\b/' $f; done

Если у вас не установлен Perl, вы сможете найти текстовый редактор, который позволяет искать и заменять файлы.

7 голосов
/ 21 февраля 2009

В Windows API всегда поддерживается прямая косая черта в качестве разделителя каталогов. И это потому, что еще как минимум в DOS 3.1 он также был поддержан. Проблема всегда была COMMAND.COM и CMD.EXE. Они используют косую черту в качестве индикатора опции (вместо черты, как в Unix). Никогда не используйте обратную косую черту для разделителей каталогов в языках, где обратная косая черта в строке используется для экранирования специальных символов.

Если вам не хватает оболочки Unix, разве у вас нет редактора, который выполняет поиск / замену по нескольким файлам? Черт возьми, напиши небольшую программу, чтобы сделать это, если нужно. Анализ исходного кода C ++ для его операторов #include не может быть сложным.

5 голосов
/ 21 февраля 2009

Всегда используйте косую черту в директивах #include. Некоторым операционным системам / компиляторам это требуется, и Windows / Visual Studio достаточно умна, чтобы справиться с этим правильно.

Поскольку вы начали с кода Windows, я предполагаю, что у вас есть Visual Studio. Используйте диалог поиска и замены и создайте регулярное выражение, которое заменит вас. Запустите поиск и замену для всех файлов.

Например, используйте что-то вроде этого:

#include:b+<{[^\\\>]}\\

для вашего поискового выражения и

#include <\1

для выражения замены ( предупреждение: не проверено ). Запустите это для всех файлов, пока не будут сделаны замены. Затем переключите угловые скобки в кавычки и повторите.

4 голосов
/ 21 февраля 2009

Какую версию Windows вы используете? Насколько я знаю, начиная с Windows XP, косые черты действительно работают как разделители пути.

0 голосов
/ 20 августа 2014

Вы можете попробовать эту команду, основываясь на предыдущей команде perl, которая выполняет работу повторно

find .  -type f -name \* | xargs grep '#include' | grep '\\' |awk -F: '{print $1}'|sort| uniq | xargs -n1 perl -i.bak -pe 'tr!\\!/! if /^\s*#\s*include\b/'
...