C++ makefile中的链接器错误

C++ makefile中的链接器错误,c++,makefile,dependency-management,C++,Makefile,Dependency Management,我在修改我找到的makefile时遇到了一点问题。下面是我所拥有的。当我运行它时,我会收到数百个“未定义的引用”错误,主要是抱怨在UnitTest中找不到东西。例如,第一个是 /home/t/pf/test/main.cpp:63: undefined reference to `UnitTest::RunAllTests()' 为什么会这样?这是否与自动生成依赖项的方式有关 以下是生成文件: # output binary BIN := main # source files SRCS :

我在修改我找到的makefile时遇到了一点问题。下面是我所拥有的。当我运行它时,我会收到数百个“未定义的引用”错误,主要是抱怨在
UnitTest
中找不到东西。例如,第一个是

/home/t/pf/test/main.cpp:63: undefined reference to `UnitTest::RunAllTests()'
为什么会这样?这是否与自动生成依赖项的方式有关

以下是生成文件:

# output binary
BIN := main

# source files
SRCS := \
    main.cpp test_resamplers.cpp test_rv_eval.cpp test_rv_samp.cpp

# intermediate directory for generated object files
OBJDIR := .o
# intermediate directory for generated dependency files
DEPDIR := .d

# object files, auto generated from source files
OBJS := $(patsubst %,$(OBJDIR)/%.o,$(basename $(SRCS)))

# compilers (at least gcc and clang) don't create the subdirectories automatically
$(shell mkdir -p $(DEPDIR))
$(shell mkdir -p $(dir $(OBJS)) >/dev/null)

# C++ compiler
CXX := g++
# linker
LD := g++

# C++ flags
CXXFLAGS := -std=c++11
# C/C++ flags
CPPFLAGS := -g -Wall -Wextra -pedantic -I/usr/local/include/UnitTest++ -I/usr/include/eigen3 -I../include
# linker flags
LDFLAGS := "-L../bin" "-L/usr/local/lib"
# flags required for dependency generation; passed to compilers
DEPFLAGS = -MT $@ -MD -MP -MF $(DEPDIR)/$*.Td
# libraries
LDLIBS := -lpf -lUnitTest++

# compile C++ source files
COMPILE.cc = $(CXX) $(DEPFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -o $@
# link object files to binary
LINK.o = $(LD) $(LDFLAGS) $(LDLIBS) -o $@
# precompile step
PRECOMPILE =
# postcompile step
POSTCOMPILE = mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d

all: $(BIN)

.PHONY: clean
clean:
    $(RM) -r $(OBJDIR) $(DEPDIR)

.PHONY: help
help:
    @echo available targets: all clean

$(BIN): $(OBJS)
    $(LINK.o) $^

$(OBJDIR)/%.o: %.cpp
$(OBJDIR)/%.o: %.cpp $(DEPDIR)/%.d
    $(PRECOMPILE)
    $(COMPILE.cc) $<
    $(POSTCOMPILE)

.PRECIOUS = $(DEPDIR)/%.d
$(DEPDIR)/%.d: ;

-include $(DEPS)
#输出二进制文件
BIN:=主
#源文件
SRCS:=\
main.cpp test_resamplers.cpp test_rv_eval.cpp test_rv_samp.cpp
#生成的对象文件的中间目录
OBJDIR:=.o
#生成的依赖项文件的中间目录
DEPDIR:=.d
#对象文件,从源文件自动生成
OBJS:=$(patsubst%,$(OBJDIR)/%.o,$(basename$(SRCS)))
#编译器(至少gcc和clang)不会自动创建子目录
$(shell mkdir-p$(DEPDIR))
$(shell mkdir-p$(dir$(OBJS))>/dev/null)
C++编译程序
CXX:=g++
#链接器
LD:=g++
βC++标志
CXXFLAGS:=-std=c++11
#C/C++标志
CPPFLAGS:=-g-Wall-Wextra-pedantic-I/usr/local/include/UnitTest++-I/usr/include/eign3-I../include
#链接器标志
LDFLAGS:=“L../bin”“-L/usr/local/lib”
#生成依赖项所需的标志;传递给编译器
DEPFLAGS=-MT$@-MD-MP-MF$(DEPDIR)/$*.Td
#图书馆
LDLIBS:=-lpf-lUnitTest++
编译C++源文件
COMPILE.cc=$(CXX)$(DEPFLAGS)$(CXXFLAGS)$(CPPFLAGS)-c-o$@
#将对象文件链接到二进制文件
LINK.o=$(LD)$(LDFLAGS)$(LDLIBS)-o$@
#预编译步骤
预编译=
#后压缩步
POSTCOMPILE=mv-f$(DEPDIR)/$*.Td$(DEPDIR)/$*.d
全部:$(BIN)
.假冒:干净
清洁:
$(RM)-r$(OBJDIR)$(DEPDIR)
.冒牌货:救命
帮助:
@回波可用目标:全部清除
$(BIN):$(OBJS)
$(LINK.o)$^
$(OBJDIR)/%.o:%.cpp
$(OBJDIR)/%.o:%.cpp$(DEPDIR)/%.d
$(预编译)
$(COMPILE.cc)$<
$(邮政编码)
.PRECIOUS=$(DEPDIR)/%.d
美元(DEPDIR)/%;
-包括美元(DEPS)

当到达第$(LINK.o)$^行时,必须显示所有未定义的引用,此消息是链接问题

使用g++时,链接顺序很重要,请参见。我会试着换一个

# link object files to binary
LINK.o = $(LD) $(LDFLAGS) $(LDLIBS) -o $@


这在我将
LDFLAGS:=“-L../bin”“-L/usr/local/lib”
更改为
LDFLAGS:=-no-pie“-L../bin”“-L/usr/local/lib”
后生效。非常感谢。
# link object files to binary
LINK.o = $(LD) $(LDFLAGS) -o $@
$(BIN): $(OBJS)
$(LINK.o) $^
$(BIN): $(OBJS)
$(LINK.o) $^ $(LDLIBS)