如何正确组合gcc的-o与-MM编译参数?
解决gcc生成依赖时目标文件被截断的问题
我来帮你分析下这个问题,大概率是这几个原因导致的,对应解决办法如下:
先检查
deps目录是否存在
你用-MF deps/main.d指定了依赖文件的路径,但如果deps文件夹还没创建,gcc无法写入依赖文件,会导致编译过程异常,目标文件只生成了一部分就被截断。解决方法很简单,先创建目录:mkdir -p deps再重新执行编译命令即可。
明确指定依赖文件中的目标项(添加
-MT选项)
有些gcc版本中,当同时使用-MM和-c时,如果不明确指定依赖文件里的目标名称,gcc可能会出现逻辑混淆,影响目标文件的生成。可以在命令中加入-MT选项,明确告诉gcc依赖对应的目标文件:cc -MM -MP -MT obj/main.o -MF deps/main.d -Wall -c -o obj/main.o src/main.c cc -MM -MP -MT obj/foo.o -MF deps/foo.d -Wall -c -o obj/foo.o src/foo.c这样能让gcc清晰区分依赖生成和目标文件编译的逻辑。
分开执行编译和依赖生成(备选方案)
如果上面的方法都不行,你可以把编译目标文件和生成依赖文件的操作分开,避免两者互相干扰:# 先编译生成目标文件 cc -Wall -c -o obj/main.o src/main.c cc -Wall -c -o obj/foo.o src/foo.c # 再单独生成依赖文件 cc -MM -MP -MF deps/main.d src/main.c cc -MM -MP -MF deps/foo.d src/foo.c虽然会多一次编译操作,但能彻底避免冲突问题。
检查gcc版本
极少数情况下,旧版本的gcc可能存在-MM与-c同时使用的bug,导致目标文件生成异常。可以通过gcc --version查看版本,必要时升级到较新的稳定版本。
内容的提问来源于stack exchange,提问作者null
相关产品推荐
相关产品推荐

