我正在开发一个需要外部开源库的 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 做类似的事情:
下载特定版本的原始库(为了永远不会有任何兼容性问题)
使用
patch
和差异文件 (.patch
) 应用补丁根据原始库的要求,使用
cmake
为当前平台编译补丁库(静态或动态)使用
编译我的项目libpatched
您认为这些步骤是否有效,或者是否有更好的方法来处理对修补库的这种需求?
如果是,由于我根本不是创建 Makefile 的专家,是否有一种简单的方法可以通过简单地利用正确编写的 Makefile 来实现这一目标?
哪种方法最好?
非常感谢您。
最佳答案
在使用我的操作系统内核补丁构建交叉编译器等时,我已经完全这样做了。您可以在 Makefile 中使用 wget
或 curl
命令。例如像
# 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/