c - 如何有效地修补外部库并将其编译到 C 项目的 Makefile 中?

标签 c makefile compilation static-libraries patch

我正在开发一个需要外部开源库的 C 项目。 特别是,它需要我自己修补的版本以添加一些需要的功能。

目前我正在使用一个 Makefile,它期望 ./lib 文件夹中有一个静态编译版本的补丁库(我们称它为 libpatched.a) , 以及相应的头文件在 ./include/libpatched 中。 以下是上述 Makefile 的主要部分:

EXECNAME=MyExecutable

CC=gcc

SRC_DIR=src
OBJ_DIR=obj

SRC=$(wildcard $(SRC_DIR)/*.c)

OBJ=$(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)

CFLAGS += -Wall -O2 -Iinclude -Iinclude/libpatched
LDFLAGS += -Llib
LDLIBS += -lpatched

.PHONY: all clean

all: $(EXECNAME)

$(EXECNAME): $(OBJ_CC)
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    $(RM) $(OBJ_DIR)/*.o

这个 Makefile 工作正常;然而,我正在寻找一个更灵活的解决方案,它在调用 make 之前不需要任何静态编译的库。 我想要完成的是有一个 Makefile 做类似的事情:

  1. 下载特定版本的原始库(为了永远不会有任何兼容性问题)

  2. 使用 patch 和差异文件 (.patch) 应用补丁

  3. 根据原始库的要求,使用 cmake 为当前平台编译补丁库(静态或动态)

  4. 使用libpatched

    编译我的项目

您认为这些步骤是否有效,或者是否有更好的方法来处理对修补库的这种需求?

如果是,由于我根本不是创建 Makefile 的专家,是否有一种简单的方法可以通过简单地利用正确编写的 Makefile 来实现这一目标?

哪种方法最好?

非常感谢您。

最佳答案

在使用我的操作系统内核补丁构建交叉编译器等时,我已经完全这样做了。您可以在 Makefile 中使用 wgetcurl 命令。例如像

# foo.tar.gz needs to be downloaded
foo.tar.gz:
    wget https://download.source.from/here/foo.tar.gz -O foo.tar.gz

# the makefile requires the downloaded file.
foo_src/CMakeLists.txt: foo.tar.gz
    mkdir -p foo_src
    cd foo_src && tar xfz ../foo.tar.gz

# patch the library if flag not present
foo_patched.flag:
    cd foo_src && patch -p1 ../foo.patch
    touch foo_patched.flag

# this depends on patching
libpatched.a: foo_src/CMakeLists.txt foo_patched.flag 
    cd foo_src && cmake
    cp foo_src/libfoo.a libpatched.a

Makefile 格式非常简单——不像 CMake! - 规则只是说:“要生成左侧的文件,请先在右侧构建先决条件。然后执行这些命令以实际生成左侧的文件”

关于c - 如何有效地修补外部库并将其编译到 C 项目的 Makefile 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58517878/

相关文章:

c - 如何获取套接字中命令的正常运行时间

c - 在gets之前输入C.scanf。问题

makefile - make 产生 “commands commence before first target” 错误

c - esp-gdbstub 编译错误

c++ - Visual Studio 2013 上的 C++ 中的 glib

c - 统计收集程序中的舍入误差(C)

c - #define _POSIX_SOURCE 是什么意思?

c++ - 当涉及路径时,如何编写与系统无关的代码?

visual-studio-2008 - Visual Studio 构建时间

c# - 在动态编译的代码中引用动态加载的程序集