来自 makefile 的链接器错误
Linker errors from makefile
我在调整找到的 makefile 时遇到了一些问题 here。我所拥有的在下面。当我 运行 它时,我收到数百个 "undefined reference to" 错误,主要是抱怨无法在 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)
当到达第 $(LINK.o) $^ 行时,您所有未定义的引用都必须出现,此消息是一个 link 问题。
对于 g++,link 顺序很重要,请参阅 link order。我会尝试替换
# link object files to binary
LINK.o = $(LD) $(LDFLAGS) $(LDLIBS) -o $@
来自
# link object files to binary
LINK.o = $(LD) $(LDFLAGS) -o $@
和
$(BIN): $(OBJS)
$(LINK.o) $^
来自
$(BIN): $(OBJS)
$(LINK.o) $^ $(LDLIBS)
我在调整找到的 makefile 时遇到了一些问题 here。我所拥有的在下面。当我 运行 它时,我收到数百个 "undefined reference to" 错误,主要是抱怨无法在 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)
当到达第 $(LINK.o) $^ 行时,您所有未定义的引用都必须出现,此消息是一个 link 问题。
对于 g++,link 顺序很重要,请参阅 link order。我会尝试替换
# link object files to binary
LINK.o = $(LD) $(LDFLAGS) $(LDLIBS) -o $@
来自
# link object files to binary
LINK.o = $(LD) $(LDFLAGS) -o $@
和
$(BIN): $(OBJS)
$(LINK.o) $^
来自
$(BIN): $(OBJS)
$(LINK.o) $^ $(LDLIBS)