Ubuntu下g++有时在主目录生成.o文件的原因及解决方法
问题成因与解决方案
为什么主目录会出现重复的.o文件?
核心原因是你的脚本没有固定工作目录,所有操作都是基于你运行脚本时的当前目录,而不是脚本所在的代码目录:
- 如果你在主目录下执行了这个脚本,
g++ -c *.cpp会尝试编译主目录下所有的.cpp文件(如果存在的话),生成的.o自然就留在主目录里。 - 脚本开头的
rm *.o和rm explorer-app也会误删当前目录(比如主目录)下的对应文件,反而没处理代码目录里的文件。
怎么解决?
最简单的办法是让脚本先切换到自身所在的代码目录,这样不管你从哪个路径运行脚本,所有操作都会在正确的代码目录下执行。修改后的脚本如下:
#!/usr/bin/env bash # 切换到脚本所在的目录,切换失败则直接退出 cd "$(dirname "$0")" || exit 1 # 稳健清理代码目录下的旧文件 rm -f explorer-app rm -f *.o # 编译链接操作 g++ -std=c++11 -fPIC -c *.cpp g++ -std=c++11 *.o -fPIC -o explorer-app -L/usr/lib/SFML -L/usr/lib/Qt -Wl,-rpath,/usr/lib/SFML -Wl,-rpath,/usr/lib/Qt -lsfml-graphics -lsfml-window -lsfml-system -lQt5Core -lQt5Gui -lQt5Widgets
关键修改点解释
cd "$(dirname "$0")" || exit 1:$0代表脚本本身的路径,dirname "$0"会取出脚本所在的目录,cd到这个目录;|| exit 1确保如果切换目录失败(比如脚本路径有误),脚本直接退出,避免后续错误操作。- 给
rm加上-f参数:避免因为文件不存在而报错中断脚本,让清理操作更稳健。
这样修改后,不管你在哪个目录运行脚本,所有编译、清理操作都会限制在你的代码目录里,主目录再也不会出现意外生成的.o文件了。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

