You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:13:11