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
但我想这不是正确的做法吗?
答案 0 :(得分:2)
如果您提供了至少一些错误(可能是前几个),这将有所帮助。
构建目标文件的编译器调用是错误的。如果没有指定任何其他标志,编译器将尝试获取所有输入文件并从中创建可执行文件。所以这个规则:
main.o : link.h main.cpp
$(CXX) $(CXXFLAGS) main.cpp
扩展到此编译行:
clang++ -Wall -Wextra main.cpp
编译器将尝试编译并链接 main.cpp
文件(仅限于此处列出的所有文件)到名为a.out
的可执行文件中(默认情况下)。 / p>
如果要构建目标文件而不是链接程序,则需要将-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)