使用Qt Creator作为Linux IDE,实现Redis源码编译和断点调试(2)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 使用Qt Creator作为Linux IDE,实现Redis源码编译和断点调试

7、编译通过,运行会报错:


09:26:00: Starting /root/Downloads/nginx/nginx-1.12.2/build-nginxQtProject_firecat-Desktop_Qt_5_9_7_GCC_64bit-Debug/nginx...

nginx: [alert] could not open error log file: open() "/usr/local/nginx/logs/error.log" failed (2: No such file or directory)

2018/11/04 09:26:00 [emerg] 13081#0: open() "/usr/local/nginx/conf/nginx.conf" failed (2: No such file or directory)

09:26:00: /root/Downloads/nginx/nginx-1.12.2/build-nginxQtProject_firecat-Desktop_Qt_5_9_7_GCC_64bit-Debug/nginx exited with code 1


解决办法:手动新建/usr/local/nginx/logs和conf路径,把配置文件拷贝过来。


另外,html文件夹(里面有两个文件)也记得拷贝到/usr/local/nginx/路径下。



8、我们终于可以执行断点调试,大功告成!

image.png



nginx启动之后,在浏览器输入http://localhost/,即可看到index.html网页。



9、附录:完整的Qt工程源码下载


https://download.csdn.net/download/libaineu2004/10763167



---


参考文献:https://blog.csdn.net/zileqide/article/details/76736668


查看nginx是否启动成功


netstat -lnpt | grep nginx


或者ps -ef |grep nginx 查看nginx进程是否启动


或者netstat -nalp|grep 80 查看80端口的进程


终止nginx

kill -9 <nginx进程号>(一般有2~3个进程,通过netstat -lnpt | grep nginx命令可以查询进程号)


例如kill -9 36533


2、源码准备


使用黄建宏的带中文注释的版本,https://github.com/huangz1990/redis-3.0-annotated


我们解压源码,先使用gcc编译,主要目的是把deps库编译出来


[root@localhost redis_study]# chmod -R 777 redis-3.0-annotated-unstable

[root@localhost redis_study]# cd redis-3.0-annotated-unstable/

[root@localhost redis-3.0-annotated-unstable]# make

3、和nginx源码不同,redis的结构更复杂,因为nginx的编译结果是单一的执行文件,而redis会生成N多个执行文件:


redis-server


redis-cli


redis-benchmark


redis-check-aof


redis-check-dump


redis-sentinel


所以,我们新建的Qt Creator必须是多个子项目类型:

image.png



4、redisQtProject.pro,firecat这里只关注最主要的redis-server和redis-cli两个执行程序


TEMPLATE = subdirs

CONFIG += ordered

SUBDIRS += \

   redis-server \

   redis-cli

common.pri,因为前面已经把deps的库编译好了,这里只需要添加库依赖即可

isEmpty(PREFIX_SRC) {
    PREFIX_SRC = ../../src
}
isEmpty(PREFIX_DEPS) {
    PREFIX_DEPS = ../../deps
}
LIBS = -ldl -lpthread -lcrypt -lpcre -lz
LIBS += "$$PREFIX_DEPS/hiredis/libhiredis.a"
LIBS += "$$PREFIX_DEPS/lua/src/liblua.a"
INCLUDEPATH += \
    #$$PREFIX_SRC/ \
    $$PREFIX_DEPS/hiredis \
    #$$PREFIX_DEPS/hiredis/adapters \
    $$PREFIX_DEPS/jemalloc/include/ \
    $$PREFIX_DEPS/jemalloc/include/jemalloc/internal \
    #$$PREFIX_DEPS/jemalloc/include/msvc_compat \
    $$PREFIX_DEPS/linenoise \
    $$PREFIX_DEPS/lua/src \
    $$PREFIX_DEPS/lua/etc
HEADERS += \
    $$PREFIX_SRC/adlist.h \
    $$PREFIX_SRC/ae.h \
    $$PREFIX_SRC/anet.h \
    $$PREFIX_SRC/asciilogo.h \
    $$PREFIX_SRC/bio.h \
    $$PREFIX_SRC/cluster.h \
    $$PREFIX_SRC/config.h \
    $$PREFIX_SRC/crc64.h \
    $$PREFIX_SRC/dict.h \
    $$PREFIX_SRC/endianconv.h \
    $$PREFIX_SRC/fmacros.h \
    $$PREFIX_SRC/help.h \
    $$PREFIX_SRC/intset.h \
    $$PREFIX_SRC/lzf.h \
    $$PREFIX_SRC/lzfP.h \
    $$PREFIX_SRC/pqsort.h \
    $$PREFIX_SRC/rand.h \
    $$PREFIX_SRC/rdb.h \
    $$PREFIX_SRC/redis.h \
    $$PREFIX_SRC/redisassert.h \
    $$PREFIX_SRC/release.h \
    $$PREFIX_SRC/rio.h \
    $$PREFIX_SRC/sds.h \
    $$PREFIX_SRC/sha1.h \
    $$PREFIX_SRC/slowlog.h \
    $$PREFIX_SRC/solarisfixes.h \
    $$PREFIX_SRC/testhelp.h \
    $$PREFIX_SRC/util.h \
    $$PREFIX_SRC/version.h \
    $$PREFIX_SRC/ziplist.h \
    $$PREFIX_SRC/zipmap.h \
    $$PREFIX_SRC/zmalloc.h \
    $$PREFIX_DEPS/linenoise/linenoise.h

redis-server.pro

TARGET = redis-server
include(../common.pri)
SOURCES += \
    $$PREFIX_SRC/adlist.c \
    $$PREFIX_SRC/ae.c \
    $$PREFIX_SRC/ae_epoll.c \
    $$PREFIX_SRC/ae_evport.c \
    $$PREFIX_SRC/ae_kqueue.c \
    $$PREFIX_SRC/ae_select.c \
    $$PREFIX_SRC/anet.c \
    $$PREFIX_SRC/aof.c \
    $$PREFIX_SRC/bio.c \
    $$PREFIX_SRC/bitops.c \
    $$PREFIX_SRC/blocked.c \
    $$PREFIX_SRC/cluster.c \
    $$PREFIX_SRC/config.c \
    $$PREFIX_SRC/crc16.c \
    $$PREFIX_SRC/crc64.c \
    $$PREFIX_SRC/db.c \
    $$PREFIX_SRC/debug.c \
    $$PREFIX_SRC/dict.c \
    $$PREFIX_SRC/endianconv.c \
    $$PREFIX_SRC/hyperloglog.c \
    $$PREFIX_SRC/intset.c \
    $$PREFIX_SRC/lzf_c.c \
    $$PREFIX_SRC/lzf_d.c \
    $$PREFIX_SRC/memtest.c \
    $$PREFIX_SRC/multi.c \
    $$PREFIX_SRC/networking.c \
    $$PREFIX_SRC/notify.c \
    $$PREFIX_SRC/object.c \
    $$PREFIX_SRC/pqsort.c \
    $$PREFIX_SRC/pubsub.c \
    $$PREFIX_SRC/rand.c \
    $$PREFIX_SRC/rdb.c \
    #$$PREFIX_SRC/redis-benchmark.c \
    #$$PREFIX_SRC/redis-check-aof.c \
    #$$PREFIX_SRC/redis-check-dump.c \
    #$$PREFIX_SRC/redis-cli.c \
    #$$PREFIX_SRC/redis.c \
    $$PREFIX_SRC/release.c \
    $$PREFIX_SRC/replication.c \
    $$PREFIX_SRC/rio.c \
    $$PREFIX_SRC/scripting.c \
    $$PREFIX_SRC/sds.c \
    $$PREFIX_SRC/sentinel.c \
    $$PREFIX_SRC/setproctitle.c \
    $$PREFIX_SRC/sha1.c \
    $$PREFIX_SRC/slowlog.c \
    $$PREFIX_SRC/sort.c \
    $$PREFIX_SRC/syncio.c \
    $$PREFIX_SRC/t_hash.c \
    $$PREFIX_SRC/t_list.c \
    $$PREFIX_SRC/t_set.c \
    $$PREFIX_SRC/t_string.c \
    $$PREFIX_SRC/t_zset.c \
    $$PREFIX_SRC/util.c \
    $$PREFIX_SRC/ziplist.c \
    $$PREFIX_SRC/zipmap.c \
    $$PREFIX_SRC/zmalloc.c \
    $$PREFIX_DEPS/linenoise/linenoise.c
SOURCES += \
    $$PREFIX_SRC/redis.c


redis-cli.pro文件类似,这里不再赘述。


5、我们终于可以执行断点调试,大功告成!

image.png



6、附录:完整的Qt工程源码下载


https://download.csdn.net/download/libaineu2004/10763933






相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
Linux 编译器 开发工具
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
141 2
|
23天前
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
175 14
|
27天前
|
NoSQL 关系型数据库 MySQL
Linux安装jdk、mysql、redis
Linux安装jdk、mysql、redis
175 7
|
2月前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
99 4
|
4月前
|
C++
vtkdicom0.8_vtk9.2_dcmtk3.6.7_qt6.2编译OK
本文介绍了如何编译整合VTK 9.2、DICOM 0.8、DCMTK 3.6.7和Qt 6.2的步骤,包括安装Qt、CMake配置以及确认相关路径和版本设置。
104 1
vtkdicom0.8_vtk9.2_dcmtk3.6.7_qt6.2编译OK
|
3月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
125 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
|
3月前
|
Linux 编译器 C语言
Linux c/c++之多文档编译
这篇文章介绍了在Linux操作系统下使用gcc编译器进行C/C++多文件编译的方法和步骤。
54 0
Linux c/c++之多文档编译
|
2月前
|
Linux
Linux - 如何编译源码安装软件
源码编译安装通常包括三个步骤:1) `./configure` 检测平台特征和依赖项,生成 Makefile;2) `make` 编译源码,生成可执行文件;3) `make install` 将可执行文件安装到指定目录并配置环境变量。
89 0
|
3月前
|
Linux 开发工具
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
157 0