![](/img/trans.png)
[英]make error: “g++: error: main.o: No such file or directory”
[英]g++ consolidation: ld: fatal: file main.o: unknown file type
我正在扫描Web和所有项目文件以寻求解决方案,但仍然找不到答案,为什么我的链接器无法完成工作。 一切都顺利地编译成.o文件,但最后一个make命令失败。 这是Makefile的内容:
CXX = g++
CXXFLAGS = -Wall -pedantic -c
OBJS = main.o operacje.o porownaj.o
dzialania: $(OBJS)
$(CXX) $^ -o $@
main.o: main.cpp operacje.h porownaj.h
$(CXX) $(CXXFLAGS) $^ -o $@
operacje.o: operacje.cpp operacje.h porownaj.h
$(CXX) $(CXXFLAGS) $^ -o $@
porownaj.o: porownaj.cpp operacje.h porownaj.h
$(CXX) $(CXXFLAGS) $^ -o $@
clean:
rm -f *o
再一次,这是弹出的错误:
g++ main.o operacje.o porownaj.o -o dzialania
ld: fatal: file main.o: unknown file type
ld: fatal: file processing errors. No output written to dzialania
*** Error code 1
make: Fatal error: Command failed for target `dzialania'
我确定这是一个基本错误,但是在盯着文件几个小时后,我还是不会注意到它。 也许你们中的一些人以崭新的眼光注意到了这个错误。
顺便说一句。 这是我长期潜伏后的第一篇文章,希望我做对了所有事情。 提前致谢!
@ edit1好,我做了所有建议的更正
@ edit2似乎问题是由于我程序的模块划分不正确引起的。 我将重新排列它的结构,然后告诉您它是否有效。 感谢所有的支持!
@ edit3好,我更改了程序的结构,一切运行顺利,再次感谢!
尝试在规则中使用$<
而不是$^
来编译main.o
, operacje.o
和porownaj.o
:
main.o: main.cpp operacje.h porownaj.h
$(CXX) $(CXXFLAGS) $< -o $@
operacje.o: operacje.cpp operacje.h porownaj.h
$(CXX) $(CXXFLAGS) $< -o $@
porownaj.o: porownaj.cpp operacje.h porownaj.h
$(CXX) $(CXXFLAGS) $< -o $@
这将导致make仅编译相应的.cpp
文件。 当您使用$^
,头文件将传递到g++
命令,该命令告诉编译器为其创建预编译的头-这就是main.o
而不是main.cpp
的目标文件的结尾。
GNU make
变量定义,例如CC = g++
或CFLAGS = -Wall -pedantic
等。应分别位于单独的行:
CC = g++
CFLAGS = -Wall -pedantic
OBJS = main.o operacje.o porownaj.o
顺便说一句,你可能是说
CXX = g++
CXXFLAGS = -Wall -pedantic
当然,您当然不需要-c
在您的CFLAGS
或CXXFLAGS
; 您确实应该删除它。
另外,食谱应遵循其规则,因此您需要
dzialania: $(OBJS)
$(LINK.cc) $^ -o $@
operacje.o: operacje.cpp operacje.h porownaj.h
$(CXX) $(CXXFLAGS) -c $< -o $@
这几个空格实际上是一个制表符。
运行make -p
以了解make
已知的规则; 也看到这个答案和那一个 。
花一些时间阅读GNU make文档 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.