【问题标题】:MAkefiles and linking : libraries order? [duplicate]生成文件和链接:库顺序? [复制]
【发布时间】:2021-04-19 09:30:52
【问题描述】:

我创建了一个 make 文件来构建一个包含多个文件夹、多个库的项目。当我执行完全重建(即删除任何以前的对象和输出)时,一切都很顺利。但是如果我修改其中一个依赖项......它被编译(到目前为止一切都很好),图书馆被移动到正确的地方,但是链接器说"undefined reference to..."这个修改后的图书馆的许多符号。我还检查了我将库放在库列表中的顺序实际上很重要,并且我或多或少地遇到了上述错误。我做错了什么?谢谢!!!为了简单起见,我在这里省略了依赖项的构建。

#===== aliases =====
#--- compiler
CC:=g++
CFLAGS:=-g -Wall -ansi
KDEBUG:=0
APNAME:=MyApp
OBJS:=$(wildcard *.o)

#--- folders
MAINPATH:=/home/entity-k/KLABS/AppFolder
#MAINPATH:=.
SRCDIR:=$(MAINPATH)/src
EXEDIR:=$(MAINPATH)/bin
OBJDIR:=$(MAINPATH)/obj
LIBDIR:=$(MAINPATH)/lib

#--- output file
OUTPUT:=$(EXEDIR)/$(APNAME)

#--- include folders
INCLUDES = -I $(SRCDIR)/include
INCLUDES += -I $(SRCDIR)/kMath
INCLUDES += -I $(SRCDIR)/kStd
INCLUDES += -I $(SRCDIR)/kRTLib
INCLUDES += -I $(SRCDIR)/kSimCore
INCLUDES += -I $(SRCDIR)/kEXE
INCLUDES += -I $(SRCDIR)/NetIFC
INCLUDES += -I $(SRCDIR)/kEOM
INCLUDES += -I $(SRCDIR)/kFCS
INCLUDES += -I $(SRCDIR)/kPwrP

#--- List of dependencies
KSTD_LIB:= $(LIBDIR)/kstd.a
KMATH_LIB:= $(LIBDIR)/kmath.a
KRT_LIB:= $(LIBDIR)/krtlib.a
KSIMCORE_LIB:= $(LIBDIR)/ksimcore.a
KEXE_LIB:= $(LIBDIR)/kexe.a
KEOM_LIB:= $(LIBDIR)/keom.a
KNETIFC_LIB:= $(LIBDIR)/netifc.a
KPWRP_LIB:= $(LIBDIR)/kpwrp.a
KFCS_LIB:= $(LIBDIR)/kfcs.a
MAINOBJ:= $(OBJDIR)/main.o

MAIN_DEPENDS = $(MAINOBJ) $(KSTD_LIB) $(KMATH_LIB) $(KRT_LIB) $(KSIMCORE_LIB) $(KEXE_LIB) 
MAIN_DEPENDS += $(KEOM_LIB) $(KPWRP_LIB) $(KFCS_LIB) $(KNETIFC_LIB)

LIBRARIES:= -lkeom -lksimcore -lkrtlib -lkmath -lkstd -lkexe -lrt -lnetifc -lkfcs -lkpwrp

#--- directives
vpath %.h ../include

ifeq ($(KDEBUG),1)
    VERBOS:= -Xlinker --verbose
else
    VERBOS:=
endif

all: $(OUTPUT)

#--- Clean tool ---
clean:
    -rm $(OBJDIR)/*.o
    -rm -R *.o
    -rm $(OBJDIR)/*.a
    -rm -R *.a
    -rm $(EXEDIR)/*
    -rm $(LIBDIR)/*.a
    @echo all object file deleted, executable deleted

#--------- Build the main app executable -------------

$(OUTPUT): $(MAIN_DEPENDS)
    @+echo
    @echo "===== Linking the App - Full Build ====="
    @$(CC) $(CFLAGS) $(VERBOS) -o $(OUTPUT) $(OBJDIR)/main.o -L$(LIBDIR) $(LIBRARIES)
    @echo "Application build successfull. "
    @+echo

【问题讨论】:

    标签: c++ linux makefile


    【解决方案1】:

    链接器的传统行为是在命令行指定的库中从左到右搜索外部函数。这意味着包含函数定义的库应该出现在任何使用它的源文件或目标文件之后。

    Source

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多