怎样把redis编译为库,挪为己用?

Posted xxfcz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样把redis编译为库,挪为己用?相关的知识,希望对你有一定的参考价值。

  其实这是个伪命题。因为只要正常编译redis,那么在 /deps/hiredis/ 目录下就会生成动态库文件 libhiredis.so。

 

  为了便于学习redis源码,编写一些测试程序,并进行单步跟踪调试,可以新建一个子目录 /unit,在下面写自己的程序,如:

/*
 * ex01.c
 *
 *  Created on: Jan 9, 2017
 *      Author: xxf
 */


#include <stdio.h>

#include "../src/sds.h"

int main()
{
    sds s = sdsnew("hello");
    size_t len = sdslen(s);
    printf("string: %s\nlength: %d\n", s, len);
    return 0;
}

 

然后编写一个Makefile:

.PHONY: all

all: ex01

ex01: ex01.c
	gcc -o ex01 -O1 -g -ggdb ex01.c -L ../deps/hiredis/ -lhiredis
	

再执行编译:

$ make all

即可得到我们的实验程序 ex01。运行结果如下:

~/workspace/redis-3.2.6/unit> ./ex01 
string: hello
length: 5

 

方法比较笨,但暂时够用了。

redis自带的单元测试是用tcl脚组织起来的,现在不会用,以后再说。

 

调试的时候,库代码的断点要打在 /deps/hireds/ 目录下的文件中。

下了断点以后,在断点处查看局部变量值的时候,有可能显示“optimized out”,可知被优化掉了。于是要调低优化级别。打开 /deps/hiredis/Makefile,找到 

  OPTIMIZATION?=-O3

改为

  OPTIMIZATION?=-O1

简单粗暴!

在 /deps/hiredis/ 目录下重新编译库 libhiredis.so,然后回到 /unit/,重新编译 ex01,成功;运行 ex01,报错:

./ex01: error while loading shared libraries: libhiredis.so.0.11: cannot open shared object file
: No such file or directory

 

该问题解决步骤如下:

1、在 /deps/hiredis/ 目录下 make install ,结果如下:

mkdir -p /usr/local/include/hiredis /usr/local/lib
cp -a hiredis.h async.h adapters /usr/local/include/hiredis
cp -a libhiredis.so /usr/local/lib/libhiredis.so.0.11
cd /usr/local/lib && ln -sf libhiredis.so.0.11 libhiredis.so.0
cd /usr/local/lib && ln -sf libhiredis.so.0 libhiredis.so
cp -a libhiredis.a /usr/local/lib

2、修改 /etc/ld.so.conf 文件,增加 /usr/local/lib

3、执行 /sbin/ldconfig

 

再次运行 ex01,成功!

单步调试,查看变量,正常!

 

以上是关于怎样把redis编译为库,挪为己用?的主要内容,如果未能解决你的问题,请参考以下文章

用于 C++ 的 C# 包装器,但仅编译为静态库

将 .hx 代码直接(或间接)编译为动态库 (ndll)

已加载运行时 CuDNN 库:8.0.5,但源代码编译为:8.1.0。使用 google colab 时

lua编译为二进制方式

CLR(Common Language Runtime) 公共语言运行库

如何使 clang 编译为 llvm IR