提问者:小点点

未定义引用--为什么链接时找不到头文件中的一些方法?


应该链接的项目是由2.cpp文件生成的。 头中的包含和所有引用本身似乎都是正确的(我们的团队中没有人能发现错误)。 因此,我认为我们的Makefile必须是错误的或遗漏了什么。

每次构建项目时,我都会在其中一个headerfile中包含的一些函数上遇到链接错误。 不是所有的。 错误如下所示,但在多个函数上:

/usr/bin/ld:utilities.cpp:(.text+0x2647):未定义对`SimpleMatMultiplication(std::Vector,std::Allocator>,std::Allocator>,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

共1个答案

匿名用户

链接过程中的未定义引用并不意味着它在头文件中找不到声明,而是意味着它在提供的任何对象文件中找不到定义/实现。

utilities.cpp似乎没有包含SimpleMatMultiplication的实现,或者至少没有包含这个确切的签名。 你的Makefile看起来不错。