【发布时间】:2020-02-07 15:04:52
【问题描述】:
我有一个当前构建可执行文件的 makefile,我正在尝试修改它以构建静态库。
我的“全部”目前看起来像这样:
all:
gcc $(SRC_FILES) -o $(PRODUCT_NAME) $(LD_FLAG) $(EXTERNAL_LIBS) $(INCLUDE_ALL_DIRS)
SRC_FILES 是通过收集几个子目录中的所有 c 文件来构建的:
SRC_FILES += $(shell find $(IOT_CLIENT_DIR)/src/ -name '*.c')
SRC_FILES += $(shell find $(IOT_CLIENT_DIR)/external_libs/jsmn -name '*.c')
SRC_FILES += $(shell find $(PLATFORM_DIR)/ -name '*.c')
SRC_FILES += $(shell find $(PLATFORM_COMMON_DIR)/ -name '*.c')
所以我明白,为了构建一个静态库 (.a),我必须用两个步骤来替换它:
从每个源文件创建目标文件
创建存档(使用
ar命令)
我的问题是,最简单的方法是什么?我在网上看到的示例,例如 this one 对每个对象文件都有单独的 gcc 调用。
理想情况下,我希望能够做这样的事情:
gcc $(SRC_FILES) ...
(get object files somehow)
ar rvs libfoo.a $(OBJ_FILES)
实现这一目标的最佳方法是什么?
【问题讨论】:
-
这确实是一个关于如何正确调用编译器的问题,而不是如何从
Makefile调用,并且显然取决于平台以及编译器。