应该链接的项目是由2.cpp文件生成的。 头中的包含和所有引用本身似乎都是正确的(我们的团队中没有人能发现错误)。 因此,我认为我们的Makefile必须是错误的或遗漏了什么。
每次构建项目时,我都会在其中一个headerfile中包含的一些函数上遇到链接错误。 不是所有的。 错误如下所示,但在多个函数上:
/usr/bin/ld:utilities.cpp:(.text+0x2647):未定义对`SimpleMatMultiplication(std::Vector
Makefile的外观如下:
CXX = g++
CXXFLAGS += -Wall -std=c++14 -pedantic
LDFLAGS =
INCLUDES = include
RM = rm -f
SRC_DIR = src
OBJ_DIR = obj
OUT_DIR = output
SRCS = $(SRC_DIR)/*.cpp
OBJS = $(OBJ_DIR)/*.o
OUTS = $(OUT_DIR)/*.txt
TARGET = waveguide
OBJS_GEN = $(OBJ_DIR)/Utilities.o
OBJS_TEST = $(OBJ_DIR)/waveguide.o $(OBJS_GEN)
.PHONY: all clean
all: $(TARGET)
waveguide: $(OBJS_TEST)
$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS)
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
$(CXX) $(CXXFLAGS) -I $(INCLUDES) -c -o $@ $<
clean:
$(RM) $(TARGET) $(OBJS) $(OUTS)
Makefile的前两个目标工作得非常好。 将生成目标文件。 错误发生在链接两个对象文件以生成目标时。
上面的Makefile中有错误吗? 尽管可能没有使用一些声明的标志(如LIBS)。 我真正不明白的是,为什么会找到(同一headerfile的)一些方法,而另一些方法被标记为未定义的引用。
使用make-n提供
g++ -Wall -std=c++14 -pedantic -I include -c -o obj/waveguide.o
src/waveguide.cpp
g++ -Wall -std=c++14 -pedantic -I include -c -o
obj/Utilities.o src/Utilities.cpp
g++ -Wall -std=c++14 -pedantic -o
waveguide obj/waveguide.o obj/Utilities.o
链接过程中的未定义引用并不意味着它在头文件中找不到声明,而是意味着它在提供的任何对象文件中找不到定义/实现。
utilities.cpp
似乎没有包含SimpleMatMultiplication
的实现,或者至少没有包含这个确切的签名。 你的Makefile看起来不错。