【问题标题】:In a Makefile: Given a set of source files, how to I create a static library instead of an executable? [duplicate]在 Makefile 中:给定一组源文件,如何创建静态库而不是可执行文件? [复制]
【发布时间】: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),我必须用两个步骤来替换它:

  1. 从每个源文件创建目标文件

  2. 创建存档(使用ar 命令)

我的问题是,最简单的方法是什么?我在网上看到的示例,例如 this one 对每个对象文件都有单独的 gcc 调用。

理想情况下,我希望能够做这样的事情:

gcc $(SRC_FILES) ...
(get object files somehow)
ar rvs libfoo.a $(OBJ_FILES)

实现这一目标的最佳方法是什么?

【问题讨论】:

  • 这确实是一个关于如何正确调用编译器的问题,而不是如何从Makefile 调用,并且显然取决于平台以及编译器。

标签: c makefile


【解决方案1】:

您需要将所有源文件构建成目标文件,然后将目标文件添加到存档中。

为此,我建议您使用 implicit rules 构建几乎所有内容。

那么makefile可能是这样的:

OBJ_FILES = $(SRC_FILES:.c=.o)

libfoo.a: $(OBJ_FILES)
    ar rcs libfoo.a $(OBJ_FILES)

【讨论】:

  • 这正是我需要的,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多