将头文件路径从Windows更改为Linux

11
我正在将一款用C++编写的应用程序从Windows移植到Linux。我在头文件路径上遇到了问题。Windows使用\,而Linux使用/。我发现每个源文件和头文件中都要修改这个路径很繁琐。有什么解决方法吗?

14
当你最终修复它时,请记住:永远不要使用反斜杠。正斜杠在Windows和Linux系统中都可以工作。 - R. Martinho Fernandes
6个回答

27

在#include路径中始终使用正斜杠。这是编译器的工作,将路径映射到底层操作系统支持的任何斜杠/目录方案。


16
个人认为,你回答的不是问题关键 -- 这个人已经有一堆带反斜杠的 #include 路径文件了。他需要的是救护车,而不是有人告诉他不应该开得太快。 - j_random_hacker
好问题!我猜他的意思是,他想避免在项目之间移动时不断地切换 / 和 \。 (楼主能否澄清一下?)显然,楼主对自己想要的看法胜过于我的,所以我撤销了我的 -1 :) - j_random_hacker
1
@j_random_hacker 他们正在移植(至少在问题提出时是这样),所以他们仍在驾驶,但尚未崩溃。将文件中的斜杠方向翻转只需要一个Perl语句。 - user146043

10

各位!是的,你们总是可以并且应该使用正斜杠。我想问题在于如何从这里到达那里

如果你已经安装了Perl,下面这个一行命令将会把C++源文件转换为使用正斜杠的版本,并将原始版本保存在一个扩展名为.bak的文件中:

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

(如果你正在使用Linux或其他类Unix的shell,请使用单引号而不是双引号括起第三个参数。)上面的命令行是为Windows准备的。

如果您有一堆需要转换的文件,例如所有以.cpp结尾的文件:

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

对应于 Bourne shell 环境(典型的 Linux shell)的命令:

for f in *.cpp; do perl -i.bak -pe 'tr!\\!/! if /^\s*#\s*include\b/' $f; done
如果您没有安装Perl,您应该能够找到一个文本编辑器,可以在文件之间进行搜索和替换。

1
如果你正在使用tcsh,你可能想要使用一个不同的分隔符,而不是!。 - Mr.Ree
@mrree:说得好。此外,您需要在某种程度上更改for循环的语法(不幸的是我忘记了确切的语法)。 - j_random_hacker

7
Windows API一直支持正斜杠作为目录分隔符。这是因为至少在DOS 3.1中也支持它。问题一直都存在于COMMAND.COM和CMD.EXE中。它们使用正斜杠作为选项指示符(而不是类Unix系统中的破折号)。在字符串中使用反斜杠来转义特殊字符的语言中,永远不要使用反斜杠作为目录分隔符。
如果您没有Unix shell,难道您没有一个可以在多个文件中进行搜索/替换的编辑器吗?如果必须的话,写一个小程序来完成它。解析C++源代码中的#include语句并不难。

2
它并不总是支持正斜杠,这是一个长期存在的问题。但现在它已经支持了。 - Martin York
2
至少在DOS 4.0版本中是这样的。 - jmucchiello
1
Joe:绝对不是真的。编译器可能支持它用于包含,资源管理器 UI 当然也支持。但 WinAPI 总体上并没有支持。 - Konrad Rudolph

5

在#include指令中始终使用正斜杠。一些操作系统/编译器需要它,而Windows/Visual Studio足够智能以正确处理它。

由于您正在使用Windows代码,我假设您有Visual Studio。使用查找和替换对话框并创建一个正则表达式,可以为您进行替换。对所有文件运行查找和替换。

例如,使用以下内容:

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

对于您的搜索表达式和

#include <\1

替换表达式(警告:未经测试)。在所有文件上运行此操作,直到不再进行替换。然后切换尖括号为引号并重复。


4

您使用的是哪个版本的Windows?据我所知,从Windows XP开始,正斜杠实际上可以作为路径分隔符。


2
我认为 OP 是从 Windows 转换到 Linux,而不是从 Linux 转换到 Windows。 - Mr Fooz
实际上,该应用程序已编写为不同平台。我正在使用其他人编写的文件。我想知道是否有更简便的方法将反斜杠转换为正斜杠或获得类似效果。 - user59988

0

你可以尝试基于以前的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/'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接