如何修改项目Makefile以集成Boehm GC适配Phoenix的word-count应用
针对Phoenix项目word-count应用集成Boehm GC的方案
前置校验
首先确认Boehm GC已正确安装到本地:
- 可通过系统包管理器直接安装开发包:Debian系执行
apt install libgc-dev,RHEL系执行yum install gc-devel - 也可通过官方源码编译安装到自定义路径,比如
/opt/boehm-gc目录
Makefile修改步骤
找到word-count应用对应目录下的Makefile,按如下规则修改:
- 头部添加GC编译、链接参数变量:
若为系统默认路径安装:
若为自定义路径安装:GC_CFLAGS = -I/usr/include/gc GC_LDFLAGS = -lgcGC_CFLAGS = -I<你的GC安装路径>/include GC_LDFLAGS = -L<你的GC安装路径>/lib -lgc -Wl,-rpath,<你的GC安装路径>/lib - 找到现有
CFLAGS定义行,将$(GC_CFLAGS)追加到行末,示例:# 修改前 CFLAGS = -Wall -O2 -I../phoenix-lib # 修改后 CFLAGS = -Wall -O2 -I../phoenix-lib $(GC_CFLAGS) - 找到生成word-count可执行文件的链接命令,将
$(GC_LDFLAGS)追加到命令最末尾(必须放在目标文件/源文件参数之后,否则会报符号未找到错误),示例:# 修改前 word-count: word_count.o $(CC) $(CFLAGS) word_count.o -o $@ ../phoenix-lib/libphoenix.a # 修改后 word-count: word_count.o $(CC) $(CFLAGS) word_count.o -o $@ ../phoenix-lib/libphoenix.a $(GC_LDFLAGS)
代码适配验证
- 若不想修改原有内存分配逻辑,可在
CFLAGS中追加-DREPLACE_MALLOC=1参数,Boehm GC会自动替换标准库的malloc/calloc/realloc/free函数 - 若要手动调用GC接口,在代码头部引入头文件
#include <gc.h>,将内存分配函数替换为对应的GC_malloc/GC_calloc等即可
常见问题排查
- 报
gc.h: No such file or directory:检查GC_CFLAGS指定的路径下是否存在gc.h文件,路径是否正确 - 链接时报
undefined reference to 'GC_malloc':首先确认GC_LDFLAGS放在链接命令的末尾,其次确认安装的Boehm GC架构和当前编译的目标架构一致 - 运行时报
libgc.so.1: cannot open shared object file:检查GC_LDFLAGS中是否添加了正确的-Wl,-rpath参数,指定动态库的运行搜索路径
内容的提问来源于stack exchange,提问作者S Bitchebe
相关产品推荐
相关产品推荐

