未定义的引用错误Makefile c++



我按照下面的方式编写了makefile,并为存储在AM.cpp中并在main中使用的所有函数获得了未定义的引用错误。我做错了什么?

CCX=g++
FLAGS +=-c -Wall -lopenal -lSDL
LINK_FLAGS += -lopenal -lSDL
all: MyExe
MyExe: main.o
    $(CXX) main.o $(LINK_FLAGS) -o MyExe
main.o: main.cpp AM.cpp AB.cpp AS.cpp
    $(CXX) $(FLAGS) main.cpp AM.cpp AB.cpp AS.cpp

您应该为您拥有的每个cpp编译一个对象,然后在最后的链接步骤中,您应该命名所有的cpp。

此外,只需要在链接器标志中指定库。

像这样:

CCX=g++
FLAGS +=-c -Wall
LINK_FLAGS += -lopenal -lSDL
all: MyExe
MyExe: main.o AM.o AB.o AS.o
    $(CXX) main.o AM.o AB.o AS.o $(LINK_FLAGS) -o MyExe
main.o: main.cpp
    $(CXX) $(FLAGS) main.cpp
AM.o: AM.cpp
    $(CXX) $(FLAGS) AM.cpp
AB.o: AB.cpp
    $(CXX) $(FLAGS) AB.cpp
AS.o: AS.cpp
    $(CXX) $(FLAGS) AS.cpp

创建一个可以重复使用的通用makefile也不是一个坏主意。我的是这样的:

CXX=gcc
CXX_FLAGS=-c -O0 -Wall -Wextra
CXX_LFLAGS=-lssl -lcrypto -ldl -liniparser
SOURCES=main.cpp test.cpp ...cpp #add your source files here
OBJECTS=$(SOURCES:.cpp=.o) #takes the .cpp files from the SOURCES var and replaces the .cpp with .o for each
EXEC=yourapp
all: $(SOURCES) $(EXEC)
clean:
    rm -f $(OBJECTS)
    rm -f $(EXEC)
$(EXEC): $(OBJECTS)
    $(CXX) -o $@ $(OBJECTS) $(CXX_LFLAGS) #$@ will be replaced with the content of EXEC, so your applications name
#a build rule for all .cpp files to be compiled to a .o file. % is a placeholder for the actual name of the file
%.o: %.cpp 
    $(CXX) $(CXX_FLAGS) $<  # $< will be replaced with the .cpp file name

最新更新