Makefile CMake外部静态库循环依赖
我正在GitHub项目中将Makefile转换为CMakeLists.txt 例如,在文件夹Makefile CMake外部静态库循环依赖,makefile,cmake,circular-dependency,Makefile,Cmake,Circular Dependency,我正在GitHub项目中将Makefile转换为CMakeLists.txt 例如,在文件夹/corres\u resolve中,其Makefile如下所示 INCLUDE_PATH := ./ ../external/include/ ../common/ SOURCE_PATH := ./ ../common/ DEPENDENCY_PATH := dep OBJECT_PATH := obj EXTERNAL_LIBS := $(wildcard ../extern
/corres\u resolve
中,其Makefile如下所示
INCLUDE_PATH := ./ ../external/include/ ../common/
SOURCE_PATH := ./ ../common/
DEPENDENCY_PATH := dep
OBJECT_PATH := obj
EXTERNAL_LIBS := $(wildcard ../external/lib/*.a)
LDLIBS := -lm -lpthread
CFLAGS += -O3
include ../makefile.mk
它的makefile.mk是
vpath %.h $(INCLUDE_PATH)
vpath %.c $(SOURCE_PATH)
vpath %.d $(DEPENDENCY_PATH)
vpath %.o $(OBJECT_PATH)
## Default .o and .dep path and program name
OBJECT_PATH ?= obj
DEPENDENCY_PATH ?= dep
PROGRAM_NAME ?= run
# Source trunk
source-files = $(wildcard $(addsuffix /*.c, $(SOURCE_PATH)))
source-list = $(notdir $(source-files))
# Binary trunk
objname-list = $(subst .c,.o, $(source-list))
object-list = $(addprefix $(OBJECT_PATH)/, $(objname-list))
# Dependency trunk
depname-list = $(subst .c,.d, $(source-list))
dependency-list = $(addprefix $(DEPENDENCY_PATH)/, $(depname-list))
# -I option to help the compiler finding the headers
CFLAGS += $(addprefix -I, $(INCLUDE_PATH))
# Build external library cmdline parameter, those -Xlinker directives instructs
# The linker find the correct linking sequence regardless the order of items
# specified in EXTERNAL_LIBS.`enter code here`
LOADLIBES += \
-Xlinker --start-group \
$(addprefix -Xlinker , $(EXTERNAL_LIBS)) \
-Xlinker --end-group
# PROGRAM_NAME is provided in custom makefile
$(PROGRAM_NAME): $(object-list)
$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
$(OBJECT_PATH)/%.o: %.c
@mkdir -p $(OBJECT_PATH)
$(COMPILE.c) $(OUTPUT_OPTION) $<
# Resolve [object,source] -- [header] dependency
-include $(dependency-list)
$(DEPENDENCY_PATH)/%.d: %.c
@mkdir -p $(DEPENDENCY_PATH)
@$(CC) -M $(CFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
vpath%.h$(包括路径)
vpath%.c$(源路径)
vpath%.d$(依赖项路径)
vpath%.o$(对象路径)
##默认.o和.dep路径和程序名
对象\路径?=obj
依赖项\路径?=dep
程序名称?=运行
#源干线
源文件=$(通配符$(addsuffix/*.c,$(源路径)))
源列表=$(notdir$(源文件))
#二进制主干
对象名列表=$(subst.c、.o、$(源列表))
对象列表=$(addprefix$(对象路径)/,$(对象名称列表))
#依赖主干
depname列表=$(subst.c、.d、$(源列表))
依赖项列表=$(addprefix$(依赖项路径)/,$(depname列表))
#-I选项以帮助编译器查找标头
CFLAGS+=$(addprefix-I,$(包含路径))
#生成外部库cmdline参数,这些-Xlinker指令指示
#无论项目的顺序如何,链接器都会找到正确的链接序列
#在外部库中指定。`在此处输入代码`
LOADLIBES+=\
-Xlinker—启动组\
$(addprefix-Xlinker,$(外部库))\
-Xlinker—端组
#程序名称在自定义生成文件中提供
$(程序名称):$(对象列表)
$(LINK.c)$^$(LOADLIBES)$(LDLIBS)-o$@
$(对象路径)/%.o:%.c
@mkdir-p$(对象路径)
$(COMPILE.c)$(输出选项)$<
#解析[对象,源]-[头]依赖项
-包含$(依赖项列表)
$(依赖项路径)/%.d:%.c
@mkdir-p$(依赖项路径)
@$(CC)-M$(CFLAGS)$<>$@.$$\
sed's,\($*\)\.o[:]*,\1.o$@:,g'<$@.$$>$@\
rm-f$@$$$$
不幸的是,$(EXTERNAL_LIBS)有10个静态*.a文件,它们彼此之间有循环依赖关系
如何在
CMakeLists.txt
中处理此问题?它在makefile.mk
文件中显示了如何使用--start group
和--end group
链接器选项解决此问题
有了GCC,您可以使用
-Wl
,-开始组
,和-Wl
,-结束组
来(仅)绕过目标链接库()中有问题的库
它在makefile.mk
文件中显示了如何使用--start group
和--end group
链接器选项解决该问题
有了GCC,您可以使用-Wl
,-开始组
,和-Wl
,-结束组
来(仅)绕过目标链接库()中有问题的库