c++合并:ld: fatal:文件主.O:未知文件类型

g++ consolidation: ld: fatal: file main.o: unknown file type

本文关键字:文件 未知 类型 fatal 合并 ld c++      更新时间:2023-10-16

我正在扫描网络和我所有的项目文件的解决方案,但仍然无法找到为什么我的链接器不会完成工作的答案。一切都顺利地编译成.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'

我确信这是某种基本的错误,但在盯着文件看了几个小时后,我不会注意到它。也许你们中的一些人会以全新的眼光注意到这个bug。

顺便说一句。这是我在长期被动潜伏之后的第一个帖子,我希望我做的一切都是对的。提前感谢!

@edit1 OK,我做了所有建议的更正

@edit2问题似乎是由于我的程序模块划分不当造成的。我会重新安排它的结构,然后让你知道它是否有效。感谢大家的支持!

@edit3好的,我改变了我的程序结构,一切都运行顺利,再次感谢!

尝试在规则中使用$<代替$^来编译main.o, operacje.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中;你真应该把它去掉。

同样,recipes应该在它的规则之后,所以你想要

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

这几个空格实际上是一个制表符字符

运行make -p了解make已知的规则;参见这个答案和那个答案。

花点时间阅读GNU make文档