繁体   English   中英

g ++合并:ld:致命:文件main.o:未知文件类型

[英]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.ooperacje.oporownaj.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在您的CFLAGSCXXFLAGS 您确实应该删除它。

另外,食谱应遵循其规则,因此您需要

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM