我正在将一款用C++编写的应用程序从Windows移植到Linux。我在头文件路径上遇到了问题。Windows使用
\
,而Linux使用/
。我发现每个源文件和头文件中都要修改这个路径很繁琐。有什么解决方法吗?在#include路径中始终使用正斜杠。这是编译器的工作,将路径映射到底层操作系统支持的任何斜杠/目录方案。
各位!是的,你们总是可以并且应该使用正斜杠。我想问题在于如何从这里到达那里!
如果你已经安装了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,您应该能够找到一个文本编辑器,可以在文件之间进行搜索和替换。在#include指令中始终使用正斜杠。一些操作系统/编译器需要它,而Windows/Visual Studio足够智能以正确处理它。
由于您正在使用Windows代码,我假设您有Visual Studio。使用查找和替换对话框并创建一个正则表达式,可以为您进行替换。对所有文件运行查找和替换。
例如,使用以下内容:
#include:b+<{[^\\\>]}\\
对于您的搜索表达式和
#include <\1
替换表达式(警告:未经测试)。在所有文件上运行此操作,直到不再进行替换。然后切换尖括号为引号并重复。
您使用的是哪个版本的Windows?据我所知,从Windows XP开始,正斜杠实际上可以作为路径分隔符。
你可以尝试基于以前的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/'