[英]C++ makefile not linking
EXENAME = prog1
OBJS = link.o main.o
CXX = clang++
CXXFLAGS = -Wall -Wextra
LD = clang++
all : $(EXENAME)
$(EXENAME) : $(OBJS)
$(LD) $(OBJS) -o $(EXENAME)
main.o : link.h main.cpp
$(CXX) $(CXXFLAGS) main.cpp
link.o : link.h link.cpp
$(CXX) $(CXXFLAGS) link.cpp
clean :
-rm -f *.o $(EXENAME)
这是我得到的make文件,但是链接中的所有功能都不能在main中调用。 我尝试了许多不可行的方法。 这有效
prog1: main.cpp link.h link.cpp
clang++ -Wall -Wextra -o prog1 main.cpp link.cpp
但是我想这不是正确的方法吗?
如果您至少提供了一些错误(可能是前几个错误),将很有帮助。
您用于构建目标文件的编译器调用是错误的。 如果未指定任何其他标志,则编译器将尝试获取所有输入文件并从中创建可执行文件。 所以这条规则:
main.o : link.h main.cpp
$(CXX) $(CXXFLAGS) main.cpp
扩展到以下编译行:
clang++ -Wall -Wextra main.cpp
编译器将尝试编译main.cpp
文件并将其链接 (仅限于此,因为此处列出的全部内容) 并链接到名为a.out
的可执行文件中(默认情况下)。
如果要构建目标文件而不是链接程序,则需要在编译行中添加-c
选项:
main.o : link.h main.cpp
$(CXX) $(CXXFLAGS) -c main.cpp
同上来建立link.o
更好的办法是简单地使用make的内置规则来编译目标文件,而不是编写自己的规则。 在这种情况下,整个makefile可能只是:
EXENAME = prog1
OBJS = link.o main.o
CXX = clang++
CXXFLAGS = -Wall -Wextra
all : $(EXENAME)
$(EXENAME) : $(OBJS)
$(CXX) $(CXXFLAGS) $(OBJS) -o $(EXENAME)
main.o : link.h
link.o : link.h
clean :
-rm -f *.o $(EXENAME)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.