C ++ makefile没有链接

时间:2017-04-24 05:03:05

标签: c++ makefile

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

但我想这不是正确的做法吗?

1 个答案:

答案 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)