当前位置: 首页 > 科技观察

说说MySQL8.0源码编译和Clion调试

时间:2023-03-19 13:02:40 科技观察

操作系统环境我在个人桌面重装了Ubuntu20.04,内核版本为5.13.0-44-generic,内存16G,磁盘240G,相关编译工具版本展示以下。相关安装命令来自《PolarDB-源码编译安装部署文档》,专门适配Ubuntu20版本。Centos版本可以在其文档中查看:installGCC7aptinstall-ygcc-7g++-7update-alternatives--install/usr/bin/gccgcc/usr/bin/gcc-760\--slave/usr/bin/g++g++/usr/bin/g++-7update-alternatives--configgccgcc--versiong++--version#安装依赖aptinstallmakeautomakecmakegitbisonlibaio-devlibncurses-devlibsasl2-devlibldap2-devlibssl-devpkg-configMySQL源码下载我们选择最新的8.0.28版本,可以到https://dev.mysql.com/downloads/mysql/直接下载带有Boost第三方库依赖的源码。Boost是一个功能强大、结构良好、跨平台、开源且完全免费的C++库,可以说是C++标准库的一半。MySQL的代码依赖于Boost库,所以直接下载一个带有Boost库的源码更省心,不需要下载对应的Boost库。要编译命令,我们首先需要使用cmake进行编译。可以直接使用命令行,也可以使用Clion开发后配置相应的cmake编译配置。其中,关于CMakeOptions的一些参数如下:-DWITH_BOOST=~/work/c++/mysql-8.0.28/boost-DCMAKE_BUILD_TYPE=Debug-DCMAKE_INSTALL_PREFIX=/home/homer/build-DMYSQL_DATADIR=/home/homer/build/data-DSYSCONFDIR=/home/homer/build-DMYSQL_UNIX_ADDR=/home/homer/build/data/mysql.sock-DMYSQL_MAINTAINER_MODE=false比较重要的有:DWITH_BOOST:指定boost路径,可以直接指向source文件夹升压文件夹;DCMAKE_BUILD_TYPE:表示debug,方便后续代码调试;DCMAKE_INSTALL_PREFIX:表示编译状态的路径,选择源文件夹以外的自建构建文件夹DMYSQL_DATADIR:表示MySQL默认数据目录,选择构建文件夹下载数据文件,执行命令编译,会占用几分钟,可能会出现各种错误和问题。本文稍后会记录问题和错误。Clion调试如果Clion的CMake执行成功,会出现相应的Run/DebugConfigurations选项,其中会有一个名为mysqld的选项,这是MySQLServer启动的选项。可以使用该选项先初始化MySQL数据目录,生成相应的配置文件和用户名密码。然后使用此选项启动MySQL服务器。两种操作对应的参数是不同的。在第一步初始化数据目录的时候,也需要先创建对应的用户。#创建MySQL用户组和MySQL用户组addmysqluseradd-r-gmysql-s/bin/falsemysql然后使用clion的mysqld执行选项,输入的程序参数如下:--basedir=/home/homer/build--datadir=/home/homer/build/data--lower_case_table_names=0--initialize-insecure--user=mysql其中--initialize-insecure表示非安全初始化,可以设置没有密码的用户。然后需要给相应的文件夹添加读、写、执行权限。chmod-R777/home/homer/build/data初始化完成后,可以继续使用clion的mysqld执行选项启动MySQL。输入的程序参数如下:--basedir=/home/homer/build--datadir=/home/homer/build/data--lower_case_table_names=0--user=mysql然后我们可以在/home/homer/在/bin目录下执行./mysql-uroot-h127.0.0.1-P3306-p即可使用客户端连接MySQLServer。登录时不需要密码,直接回车即可。然后可以看到我们在clion中设置断点的代码逻辑被拦截了,我们可以调试阅读下面的代码。问题全程记录,尤其是编译阶段,遇到的问题比较多,这里也简单记录一下,相信不同的同学在这个过程中会遇到不同的问题,大家耐心解决。1、如果default.cfg不存在,编译时会报如下错误:CMakeError:File/home/homer/work/c++/mysql-8.0.28/router/src/harness/tests/data/logger.d/default.cfgdoesnotexist.CMakeErroratrouter/cmake/testing.cmake:211(CONFIGURE_FILE):可以在cmake配置文件中找到如下片段,直接删除。CONFIGURE_TEST_FILE_TEMPLATES(${CMAKE_CURRENT_SOURCE_DIR}/data"tests-good-1.cfg.in;tests-good-2.cfg.in;tests-start-1.cfg.in")SET(TEST_FILESlogger.cfgmagic-alt.cfgtests-bad-1.cfgtests-bad-2.cfgtests-bad-3.cfg)2.编译警告被当成错误在编译过程中,发现编译器会将警告当成错误,导致整个编译过程失败.具体报错如下。cc1plus:allwarningsbeingtreatedaserrors经过查找,终于在https://dev.mysql.com/doc/mysql-sourcebuild-excerpt/8.0/en/compilation-problems.html文档中找到了对应的解决方案版本,需要将DMYSQL_MAINTAINER_MODE设置为false,否则会导致编译器将warning当成error。嵌入可以理解为组合或代理模式的自动语法糖。3、编译缓存异常后,需要删除对应的cmake缓存,重新编译,否则每次都会读取缓存,报同样的错误。