g ++盘点:ld:致命:文件main.o:未知文件类型

时间:2014-03-11 21:17:52

标签: c++ makefile g++ linker-errors

我正在扫描网络和我的所有项目文件以寻求解决方案,但仍无法找到我的链接器未能完成工作的答案。一切顺利编译成.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好了,我改变了程序的结构,一切顺利,再次感谢!

2 个答案:

答案 0 :(得分:1)

尝试在规则中使用$<代替$^来汇编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的目标文件1}}。

答案 1 :(得分:0)

GNU make变量定义(如CC = g++CFLAGS = -Wall -pedantic等)应各自独立:

CC = g++ 
CFLAGS = -Wall -pedantic 
OBJS = main.o operacje.o porownaj.o
顺便说一下,你可能意味着

CXX = g++
CXXFLAGS = -Wall -pedantic

您当然不希望-cCFLAGS明确地CXXFLAGS;你真的应该删除它。

此外,食谱应该在其规则之后,所以你想要

dzialania: $(OBJS)  
    $(LINK.cc) $^ -o $@
operacje.o: operacje.cpp operacje.h porownaj.h  
    $(CXX) $(CXXFLAGS) -c $< -o $@

几个空格实际上是一个 tab 字符。

运行make -p以了解make已知的规则;另请参阅this answerthat one

花些时间阅读GNU make documentation