Makefile CMake外部静态库循环依赖

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

我正在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 ../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
-结束组
来(仅)绕过
目标链接库()中有问题的库