怎样把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,成功!

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

时间: 2024-10-14 10:27:13

怎样把redis编译为库,挪为己用?的相关文章

在Ubuntu下编译Assimp库

在Ubuntu下编译Assimp库 如何在Ubuntu下编译Assimp库?这是我以前编译成功后做的笔记,供参考. 1.去下面的网站去下载Assimp库: http://assimp.sourceforge.net/ 2.安装cmake,似乎Assimp库只能通过cmake和vs工程文件进行构建,普通的makfile是通过它来产生的.Ubuntu下使用sudo apt-get install cmake.然后通过cmake --version查看cmake的版本,我cmake版本是2.8.11.

spdk dpdk编译动态库( shared library )

1,dpdk编译共享库 默认情况下都编译出静态库,如果想编译出动态库,把config/common_base文件中的CONFIG_RTE_BUILD_SHARED_LIB改成y即可. 2,spdk编译共享库 修改mk/spdk.common.mk: # Archive $(OBJS) into [email protected] (.so) # Archive $(OBJS) into [email protected] (.a) # LIB_C=\ #       $(Q)echo "  LI

gcc 动态编译 动态库路径

gcc 动态编译(共享库) 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令优点:体积小,编译快缺点:依赖性高 代码如下: [[email protected] shared]# cat add.cint add (int x, int y) {return x + y;} Parsed in 0.007 seconds at 12.13 KB/sadd.c 求和函数 代码如下: [[email protected] shared]# cat print.

cocos2dx 交叉编译 编译 iconv库

> cocos2dx提供三方的iconv来转化字符问题,交叉编译到android的时候,需要引入iconv的module,下载iconv,解压到cocos2d根目录 ,编写mk: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_ARM_MODE := arm ifeq ($(BUILD_WITH_NEON),1) LOCAL_ARM_NEON := true endif LOCAL_MODULE := iconv LOCAL_CF

vs2013 + python3.52 + boost1.61, 编译C++库失败

使用vs2013  + python3.52 + boost1.61,  编译C++库,  失败!  提示如下": boost::python::detail::init_module(struct PyModuleDef &,void (__cdecl*)(void))" ([email protected]@[email protected]@@[email protected]@[email protected]@[email protected]),该符号在函数 PyI

VS2008编译boost库

一.下载首先从boost官方主页http://www.boost.org/下载最新版boost安装包,我用的版本是boost.1.49.0二.新建文件夹 如果是使用下载的安装包,那么请将boost安装包解压至本地新建的目录,如:F:\boost 三.编译 (1)从vs2008的工具菜单进入命令提示窗口(单击“开始”按钮,指向“所有程序”,指向“Microsoft Visual Studio 2008”,指向“Visual Studio tools(工具)”,然后单击“Visual Studio

VS2008 编译 libpng库

一.下载libpng和zlib http://sourceforge.net/projects/libpng/ http://sourceforge.net/projects/libpng/files/zlib/ 二.解压libpng和zlib到同一文件夹下!并更名文件夹zlib...为zlib 三.打开libpng.sln或libpng.vcproj 设置libpng工程所有配置为不使用预编译头,编译相应版本即可. VS2008 编译 libpng库,码迷,mamicode.com

cocos2dx通过ndk编译c++库

ndk编译c++库,然后通过jni调用实现重要代码封装,是安卓应用中最常用的技术,一方面可以将重要的代码实现隐藏,防止泄漏,也可以提高打包速度. ndk里面的sample文件夹中有很多实用的例子,其中hello-jni有一个编译c++的例子. 首先,创建一个jn文件夹,文件夹内放置Android.mk和Application.mk两个文件,Android.mk文件主要是 写入编译的c++代码,打包的库名,打包的库类型(静态库or动态库),引用的模块等等.Application.mk 是主要表示打

win下编译ffmpeg库,Compile and build ffmpeg library and dll on Windows x64( 正版)

转载请注明:来自EricKing,thanks 从没想到编一个library这么坑爹,再次提醒各位百度的东西只能参考,想节约时间还是要到官网上去查看docum.不废话了,开始详细过程: ——>1.搭建Win下的GCC编译环境(因为win下vs不支持ffmpeg的compile 和build,官网上也有说这一点) ——>2.下载latest ffmpeg source(后面附官网地址),想办法将编译后的文件做成dll,这是win下编程调试的核心 (这里就用到vs下的一个vc的bash文件叫vcv