【问题标题】:CMake external static library circular dependencyCMake 外部静态库循环依赖
【发布时间】:2017-07-18 12:45:52
【问题描述】:

我正在将 GitHub 项目中的 Makefile 转换为 CMakeLists.txt An implementation of Deformation Transfer algorithm in ANSI C

例如文件夹/corres_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 $@.$$$$

不幸的是,$(EXTERNAL_LIBS) 有 10 个静态 *.a 文件,它们彼此之间具有循环依赖关系。

我如何在CMakeLists.txt 中处理这个问题?

【问题讨论】:

    标签: makefile cmake circular-dependency


    【解决方案1】:

    它在makefile.mk 文件中显示如何使用--start-group--end-group 链接器选项解决该问题。

    使用 GCC,您将使用 -Wl--start-group-Wl--end-group 围绕(仅)您的 target_link_libraries() 中的有问题的库。

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2012-12-21
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      相关资源
      最近更新 更多