我正在扫描网络和我的所有项目文件以寻求解决方案,但仍无法找到我的链接器未能完成工作的答案。一切顺利编译成.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好了,我改变了程序的结构,一切顺利,再次感谢!
答案 0 :(得分:1)
尝试在规则中使用$<
代替$^
来汇编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
的目标文件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
您当然不希望-c
或CFLAGS
明确地CXXFLAGS
;你真的应该删除它。
此外,食谱应该在其规则之后,所以你想要
dzialania: $(OBJS)
$(LINK.cc) $^ -o $@
operacje.o: operacje.cpp operacje.h porownaj.h
$(CXX) $(CXXFLAGS) -c $< -o $@
几个空格实际上是一个 tab 字符。
运行make -p
以了解make
已知的规则;另请参阅this answer和that one。
花些时间阅读GNU make documentation。