AliSQL的编译使用
1、下载源码
git clone https://github.com/alibaba/AliSQL.git
Linux下编译
2、编译
编译前需要安装好gcc cmake bison等。(如果缺少其他依赖,debian系的可以使用sudo apt-get build-dep mysql-server快速安装)
cd AliSQL
# 创建并进入构建目录
make build_linux && cd build_linux
# 生成 makefile
cmake -DCMAKE_INSTALL_PREFIX=/home/x/alisql   ..	#指定安装路径/home/x/alisql
# 编译
make -j4
3、安装使用
make install	# 安装
安装完成后可以进入安装目录下的bin目录
/home/x/alisql/bin [o@o-s] [11:42]
> ./mysql_config
Usage: ./mysql_config [OPTIONS]
Options:
        --cflags         [-I/home/x/alisql/include   -g -fabi-version=2 -fno-omit-frame-pointer -fno-strict-aliasing]
        --cxxflags       [-I/home/x/alisql/include   -g -fabi-version=2 -fno-omit-frame-pointer -fno-strict-aliasing]
        --include        [-I/home/x/alisql/include]
        --libs           [-L/home/x/alisql/lib -lmysqlclient -lpthread -lm -ldl]
        --libs_r         [-L/home/x/alisql/lib -lmysqlclient -lpthread -lm -ldl]
        --plugindir      [/home/x/alisql/lib/plugin]
        --socket         [/tmp/mysql.sock]
        --port           [0]
        --version        [5.6.32]
        --libmysqld-libs [-L/home/x/alisql/lib -lmysqld -lpthread -lm -lcrypt -ldl -laio]
        --variable=VAR   VAR is one of:
                pkgincludedir [/home/x/alisql/include]
                pkglibdir     [/home/x/alisql/lib]
                plugindir     [/home/x/alisql/lib/plugin]
在alisql创建一个my.cnf文件,写入配置文件信息。
启动mysql
./bin/mysqld
mysql配置文件说明(注意,配置文件应该是UTF-8编码无BOM标识的,否则可能出错)
http://www.cnblogs.com/captain_jack/archive/2010/10/12/1848496.html
windows下VS2013编译
1、生成VS2013工程
windows下使用VS2013进行编译
mkdir build_msvc
cd build_msvc
cmake -DCMAKE_INSTALL_PREFIX=D:\AliSQL -G "Visual Studio 12 Win64" ..
执行cmake前需要安装好bison。
点击下载
2、编译安装
执行完成cmake后生成VS工程文件
使用VS2013 开发人员命令提示进入build_msvc目录,执行下面命令进行编译
msbuild ALL_BUILD.vcxproj   # 编译
msbuild INSTALL.vcxproj     # 安装
可以在后面添加/p:Configuration="Release"参数来指定编译release版本。因为文件比较多,可以使用/maxcpucount:8来指定使用的CPU核心数,并行编译。
3、使用
安装后在安装目录下建立my.ini文件,具体写法可以百度。
新建一个start.bat
::
START bin\mysqld --standalone --console
双击start.bat启动即可。
4、编译错误解决
错误1:alisql\sql\binlog.h(236): error C2065: “asm”: 未声明的标识符
定位到错误代码
#define barrier() __asm volatile("" ::: "memory")
这个宏是GCC下做编译屏障的宏,VS2013不支持(x64编译也不支持内联汇编),使用windows下的替代版本
#define barrier() MemoryBarrier()
具体的可以看MemoryBarrier macro
参考http://book.51cto.com/art/201504/474436.htm
错误2:alisql\storage\innobase\include\trx0trx.h(54): error C2146: 语法错误: 缺少“,”(在标识符“attribute”的前面)
因为__attribute__是gcc的扩展,所以VC不支持也很正常。
在trx0trx.h文件最前面添加#define __attribute__(...)即可。
类似的问题还出现在sql_connect.cc等文件中,可以将上面的宏添加到预编译指令中。
错误3:AliSQL\storage\innobase\handler\ha_innodb.cc(16222): error C2440: “初始化”: 无法从“ulint *”转换为“unsigned long *”
将ha_innodb.cc中的
static MYSQL_SYSVAR_ULONG(adaptive_hash_index_parts, btr_search_index_num,
  PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
  "Number of InnoDB adaptive hash index partitions",
  NULL, NULL, 8, 1, 512, 0);
修改为
static unsigned long& btr_search_index_num_ul = (unsigned long&)btr_search_index_num;
static MYSQL_SYSVAR_ULONG(adaptive_hash_index_parts, btr_search_index_num_ul,
  PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
  "Number of InnoDB adaptive hash index partitions",
  NULL, NULL, 8, 1, 512, 0);
错误4:AliSQL\storage\innobase\read\read0read.cc(507): error C3861: “min”: 找不到标识符
将read0read.cc中代码(506-508行)
	if (view->n_descr > 0) {
		view->up_limit_id = min(view->up_limit_id, view->descriptors[0]);
	}
修改为
	if (view->n_descr > 0) {
		view->up_limit_id = (view->up_limit_id < view->descriptors[0])?
							view->up_limit_id : view->descriptors[0];
	}
错误5:AliSQL\storage\innobase\read\read0read.cc(603): error C2664: “lint win_xchg_and_add(volatile lint *,lint)”: 无法将参数 1 从“ulint *”转换为“volatile lint *”
将read0read.cc中代码(601-604行)
	os_atomic_decrement_lint(&srv_read_views_memory,
				 sizeof(read_view_t) +
				 view->max_descr * sizeof(trx_id_t));
修改为
	os_atomic_decrement_lint((volatile lint*)&srv_read_views_memory,
				 sizeof(read_view_t) +
				 view->max_descr * sizeof(trx_id_t));
这样的错误还有几个,都是做这样的修改即可。
错误6:AliSQL\sql\sql_filter.cc(134): error C3861: “__sync_add_and_fetch”: 找不到标识符
这样的错误有多个
4>E:\AliSQL\sql\sql_filter.cc(134): error C3861: “__sync_add_and_fetch”:  找不到标识符
4>E:\AliSQL\sql\sql_filter.cc(356): error C3861: “__sync_add_and_fetch”:  找不到标识符
4>E:\AliSQL\sql\sql_filter.cc(362): error C3861: “__sync_bool_compare_and_swap”:  找不到标识符
4>E:\AliSQL\sql\sql_filter.cc(455): error C3861: “__sync_sub_and_fetch”:  找不到标识符
这是gcc提供的built-in函数,用于提供加减和逻辑运算的原子操作。参考http://www.cnblogs.com/FrankTan/archive/2010/12/11/1903377.html
可以对应VC下的Interlocked函数族。
参考http://jishublog.iteye.com/blog/1898518
https://technet.microsoft.com/zh-cn/library/ms683504
带Exchange的函数返回的是更新前的值,不带的返回更新后的值。
所以这里可以在sql_filter.h(多个文件中都需要用到)文件头部添加如下宏定义来实现替换
// 返回更新前的值
#define __sync_fetch_and_add(ptr,value, ...)	InterlockedExchangeAdd64((LONG64 volatile *)ptr,value)
#define __sync_fetch_and_sub(ptr, value, ...)	InterlockedExchangeAdd64((LONG64 volatile *)ptr,-value)
#define __sync_fetch_and_or(ptr, value, ...)
#define __sync_fetch_and_and(ptr, value, ...)
#define __sync_fetch_and_xor(ptr, value, ...)
#define __sync_fetch_and_nand(ptr, value, ...)
// 返回更新后的值
#define __sync_add_and_fetch(ptr, value, ...)	InterlockedAdd64((LONG64 volatile *)ptr,value)
#define __sync_sub_and_fetch(ptr, value, ...)	InterlockedAdd64((LONG64 volatile *)ptr,-value)
#define __sync_or_and_fetch(ptr, value, ...)
#define __sync_and_and_fetch(ptr, value, ...)
#define __sync_xor_and_fetch(ptr, value, ...)
#define __sync_nand_and_fetch(ptr, value, ...)
#define __sync_bool_compare_and_swap(ptr, oldval,newval, ...) InterlockedCompareExchange64(ptr,newval,oldval)
错误7:AliSQL\sql\sql_locale.cc(789): error C2146: 语法错误: 缺少“}”(在标识符“嗒忇喃嵿嗒苦”的前面)
这是因为VS对utf-8的支持不好(编译器支持不好),将其保存为带BOM标记的UTF-8编码即可。
错误8:AliSQL\sql\sql_show.cc(3896): error C2059: 语法错误:“(”
先看一下这一段代码
// Sends the global table stats back to the client.
int fill_schema_table_stats(THD* thd, TABLE_LIST* tables, Item* __attribute__((unused)))
{
  TABLE *table= tables->table;
  DBUG_ENTER("fill_schema_table_stats");
  char *table_full_name, *table_schema;
  TABLE_SHARE *share;
  uint indx;
这里函数中出现了__attribute__((unused))这个东西,需要处理一下。
在文件sql_show.cc开头添加(在mysqld.cc中也需要)
#define __attribute__(...)
错误9:AliSQL\sql\sql_show.cc(3922): error C3861: “strsep”: 找不到标识符
这个函数在linux下是有的,windows下没有就使用下面的来替代
char *strsep(char **stringp, const char *delim)
{
    char *s;
    const char *spanp;
    int c, sc;
    char *tok;
    if ((s = *stringp)== NULL)
        return (NULL);
    for (tok = s;;) {
        c = *s++;
        spanp = delim;
        do {
            if ((sc =*spanp++) == c) {
                if (c == 0)
                    s = NULL;
                else
                    s[-1] = 0;
                *stringp = s;
                return (tok);
            }
        } while (sc != 0);
    }
    /* NOTREACHED */
}
错误10:C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets(170,5): error MSB6006: “cmd.exe”已退出,代码为 1。
因为编译ALL_BUILD工程完成后会去执行下面操作
Executing E:/AliSQL/build_msvc/sql/Debug/mysqld.exe --no-defaults --console --bootstrap --lc-messages-dir=E:/windows-software/AliSQL/build_msvc/sql/share --basedir=. --datadir=. --default-storage-engine=MyISAM --default-tmp-storage-engine=MyISAM --loose-skip-ndbcluster --max_allowed_packet=8M --net_buffer_length=16K
AliSQL的编译使用的更多相关文章
- Ubuntu安装 Alisql编译安装步骤:
		github地址: https://github.com/alibaba/AliSQL 一.直接git下载保存到本地: git clone https://github.com/alibaba/Ali ... 
- open-falcon(v0.2)部署手册(源码编译)
		今天安装falcon-plus,下面为用基础环境配置. centos 6.8 alisql5.6.32 redis-3.2.8 cmake-3.9.1 bison-3.0 openssl-1.0 ... 
- TODO:macOS编译PHP7.1
		TODO:macOS编译PHP7.1 本文主要介绍在macOS上编译PHP7.1,有兴趣的朋友可以去尝试一下. 1.下载PHP7.1源码,建议到PHP官网下载纯净到源码包php-7.1.0.tar.g ... 
- Centos6.5下编译安装mysql 5.6
		一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm -qa | grep mysql 有的话通过下面的命令来卸载掉 rpm -e mysql //普通删除模式 rpm -e ... 
- CENTOS 6.5 平台离线编译安装 PHP5.6.6
		一.下载php源码包 http://cn2.php.net/get/php-5.6.6.tar.gz/from/this/mirror 二.编译 编译之前可能会缺少一些必要的依赖包,加载一个本地yum ... 
- CENTOS 6.5 平台离线编译安装 Mysql5.6.22
		一.下载源码包 http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.22.tar.gz 二.准备工作 卸载之前本机自带的MYSQL 安装 cmake,编 ... 
- Android注解使用之注解编译android-apt如何切换到annotationProcessor
		前言: 自从EventBus 3.x发布之后其通过注解预编译的方式解决了之前通过反射机制所引起的性能效率问题,其中注解预编译所采用的的就是android-apt的方式,不过最近Apt工具的作者宣布了不 ... 
- Hawk  6. 编译和扩展开发
		Hawk是开源项目,因此任何人都可以为其贡献代码.作者也非常欢迎使用者能够扩展出更有用的插件. 编译 编译需要Visual Stuido,版本建议使用2015, 2010及以上没有经过测试,但应该可以 ... 
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
		目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ... 
随机推荐
- 使用Minicom基于串口调试HiKey
			虽然通过adb shell调试方便,但是有些时候不得不借助于串口进行调试,比如测试suspend to ram之类的功能时,adb服务被关闭. 同时在minicom中也可以进入shell,进行操作. ... 
- mysql函数大全
			对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NULL. mysql& ... 
- canvas-图片翻转
			图片90度翻转 在canvas中插入图片需先加载图片(利用Image对象);加载完成后再执行操作drawImage(obj,x,y,w,h) 插入图片的坐标宽高等值 <!DOCTYPE html ... 
- Android开发工具:  AS, Gradle, Git等
			(一)史上最详细的Android Studio系列教程 你还没有使用Android Studio + Gradle么?那就有点太落伍了,下面自己原创总结了Android Studio的一系列教程,图文 ... 
- Markdown
			1. 斜体和粗体 代码: *斜体*或_斜体_ **粗体** ***加粗斜体*** ~~删除线~~ 显示效果: 这是一段斜体 这是一段粗体 这是一段加粗斜体 这是一段删除线 2. 分级标题 第一种写法: ... 
- C#面向对象设计模式纵横谈——3.Abstract Factory 抽象工厂(创建型模式)
			动机(Motivation) 在软件系统中经常面临着“一系列相互依赖的对象”的创建工作,同时,由于需求变化,往往存在更多系列对象的创建工作.如何应对这种变化?如何绕过常规对象的创建,提供一种“封装机制 ... 
- 【codeforces 749E】 Inversions After Shuffle
			http://codeforces.com/problemset/problem/749/E (题目链接) 题意 给出一个1~n的排列,从中等概率的选取一个连续段,设其长度为l.对连续段重新进行等概率 ... 
- Hibernate配置方式
			Hibernate配置方式 Hibernate给人的感受是灵活的,要达到同一个目的,我们可以使用几种不同的办法.就拿Hibernate配置来说,常用的有如下三种方式,任选其一. 在 hibernate ... 
- java创建文件和目录
			java创建文件和目录 2013-09-04 12:56 99933人阅读 评论(7) 收藏 举报 分类: JAVA基础(10) 版权声明:本文为博主原创文章,未经博主允许不得转载. 创建文件和目 ... 
- 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor
			批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11 之前写过一篇文章,使用redgate公司的SQL PROMPT工具,但是不太方便 SQLPRO ... 
