Tidb源码编译error

/data/tidb/src/github.com/pingcap/tidb# make CGO_ENABLED=1 GO111MODULE=on go build -tags codes -ldflags '-X “github.com/pingcap/parser/mysql.TiDBReleaseVersion=v4.0.0-alpha-105-ge19ef45- dirty” -X “github.com/pingcap/tidb/util/printer.TiDBBuildTS=2019-08-23 02:31:28” -X “github.com/pingcap/tidb/util/printer.TiDBGitHash=e19ef45e3 edc6697b818ab5a4cfbde95d84f4c14” -X “github.com/pingcap/tidb/util/printer.TiDBGitBranch=master” -X “github.com/pingcap/tidb/util/printer.GoVers ion=go version go1.12 linux/amd64” ’ -o bin/tidb-server tidb-server/main.go

github.com/pingcap/parser/mysql

/data/tidb/pkg/mod/github.com/pingcap/parser@v0.0.0-20190819021501-c5d6ce829420/mysql/const.go:607:2: constant 2147483648 overflows SQLMode /data/tidb/pkg/mod/github.com/pingcap/parser@v0.0.0-20190819021501-c5d6ce829420/mysql/const.go:608:2: constant 4294967296 overflows SQLMode /data/tidb/pkg/mod/github.com/pingcap/parser@v0.0.0-20190819021501-c5d6ce829420/mysql/const.go:609:2: constant 8589934592 overflows SQLMode /data/tidb/pkg/mod/github.com/pingcap/parser@v0.0.0-20190819021501-c5d6ce829420/mysql/util.go:44:19: constant 4294967295 overflows int /data/tidb/pkg/mod/github.com/pingcap/parser@v0.0.0-20190819021501-c5d6ce829420/mysql/util.go:45:19: constant 4294967295 overflows int Makefile:178: recipe for target ‘server’ failed make: *** [server] Error 2

是修改过代码么?

当前的 master (396b094675d8641994856a82285098c39ee708bb)上面的 parser 版本好像是

github.com/pingcap/parser v0.0.0-20190822024127-41d48df05864

而报错信息上面看到的是

 github.com/pingcap/parser@v0.0.0-20190819021501-c5d6ce829420

另外,机器是 64 位的 linux?

1.机器是Ubuntu 16.04.6 LTS l4.4.0-159-generic 2.应该是tag中的v4.0.0 alpha 版本 3.没有修改过代码

机器是64bit的

我找到地方了…代码确实写得有问题,能编译过才是问题没暴露出来

var defaultLengthAndDecimal = map[byte]lengthAndDecimal{
TypeBit:        {1, 0},
TypeTiny:       {4, 0},
TypeShort:      {6, 0},
TypeInt24:      {9, 0},
TypeLong:       {11, 0},
TypeLonglong:   {20, 0},
TypeDouble:     {22, -1},
TypeFloat:      {12, -1},
TypeNewDecimal: {11, 0},
TypeDuration:   {10, 0},
TypeDate:       {10, 0},
TypeTimestamp:  {19, 0},
TypeDatetime:   {19, 0},
TypeYear:       {4, 0},
TypeString:     {1, 0},
TypeVarchar:    {5, 0},
TypeVarString:  {5, 0},
TypeTinyBlob:   {255, 0},
TypeBlob:       {65535, 0},
TypeMediumBlob: {16777215, 0},
TypeLongBlob:   {4294967295, 0},
TypeJSON:       {4294967295, 0},
TypeNull:       {0, 0},
TypeSet:        {-1, 0},
TypeEnum:       {-1, 0},

}

这里的 byte 溢出了…

还是不对… 4294967295 这个正好是 math.MaxUint32 如果机器正常 64 位,这个不应该溢出

你可以运行一个这个不?

package main
import (
    "fmt"
     "unsafe"
)
func main() {
    var a int
    fmt.Println(unsafe.Sizeof(a))
}

看输出是 8 还是 4

testgo# sudo uname --m x86_64

你给的测试代码输出是4

所以在那台机器架构上,没法跑 TiDB

你给的测试代码输出是4在Linux操作系统下使用GCC进行编程,目前一般的处理器为32位字宽,下面是/usr/include/limit.h文件对Linux下数据类型的限制及存储字节大小的说明。 /* We don’t have #include_next. Define ANSI <limits.h> for standard 32-bit words. / / These assume 8-bit 'char’s, 16-bit 'short int’s, and 32-bit 'int’s and 'long int’s. / 1.char数据类型 char类型数据所占内存空间为8位。其中有符号字符型变量取值范围为?128~127,无符号型字符变量取值范围为0~255.其限制如下: / Number of bits in a ‘char’. / # define CHAR_BIT 8 //所占字节数 / Minimum and maximum values a ‘signed char’ can hold. */ //有符号字符型范围 # define SCHAR_MIN (-128)

define SCHAR_MAX 127

/* Maximum value an 'unsigned char' can hold.  (Minimum is 0.)  */ //无符号字符型范围
#  define UCHAR_MAX 255 
/* Minimum and maximum values a 'char' can hold.  */ 
#  ifdef __CHAR_UNSIGNED__ 
#   define CHAR_MIN 0 
#   define CHAR_MAX UCHAR_MAX 
#  else 
#   define CHAR_MIN SCHAR_MIN 
#   define CHAR_MAX SCHAR_MAX 
#  endif 
2.short int数据类型
short int类型数据所占内存空间为16位。其中有符号短整型变量取值范围为?32768~32767,无符号短整型变量取值范围为0~65535.其限制如下:
/* Minimum and maximum values a 'signed short int' can hold.  */ // 有符号短整型范围
#  define SHRT_MIN (-32768)

define SHRT_MAX 32767

/* Maximum value an 'unsigned short int' can hold.  (Minimum is 0.)  */
// 无符号短整型范围
#  define USHRT_MAX 65535 
3.int数据类型int类型数据所占内存空间为32位。其中有符号整型变量取值范围为-2147483648~2147483647,无符号型整型变量取值范围为0~4294967295U.其限制如下:
/* Minimum and maximum values a 'signed int' can hold.  */  //整形范围
#  define INT_MIN (-INT_MAX - 1)

define INT_MAX 2147483647

/* Maximum value an 'unsigned int' can hold.  (Minimum is 0.)  */ 
//无符号整形范围#  define UINT_MAX 4294967295U 
4.long int数据类型
随着宏__WORDSIZE值的改变,long int数据类型的大小也会发生改变。如果__WORDSIZE的值为32,则long int和int类型一样,占有32位。在Linux GCC4.0-i386版本中,默认情况下__WORDSIZE的值为32.其定义如下:
//come from /usr/include/bits/wordsize.h 
#define __WORDSIZE 32
在64位机器上,如果__WORDSIZE的值为64, long int类型数据所占内存空间为64位。其中有长整型变量取值范围为-9223372036854775808L~9223372036854775807L,无符号长整型变量取值范围为0~18446744073709551615UL.其限制如下:
/* Minimum and maximum values a 'signed long int' can hold.  */ //有符号长整形范围
#  if __WORDSIZE == 64 
#   define LONG_MAX 9223372036854775807L 
#  else 
#   define LONG_MAX 2147483647L 
#  endif 
#  define LONG_MIN (-LONG_MAX - 1L)

/* Maximum value an ‘unsigned long int’ can hold. (Minimum is 0.) ///无符号长整形范围 # if __WORDSIZE == 64 # define ULONG_MAX 18446744073709551615UL # else # define ULONG_MAX 4294967295UL # endif 5.long long int数据类型 在C99中,还定义了long long int数据类型。其数据类型限制如下: # ifdef __USE_ISOC99 / Minimum and maximum values a ‘signed long long int’ can hold. ///无符号长长整形范围 # define LLONG_MAX 9223372036854775807LL # define LLONG_MIN (-LLONG_MAX - 1LL) / Maximum value an ‘unsigned long long int’ can hold. (Minimum is 0.) ///有符号长长整形范围 # define ULLONG_MAX 18446744073709551615ULL # endif / ISO C99 */ ———————————————— 版权声明:本文为CSDN博主「hustyangju」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/hustyangju/article/details/21640011

int 就是32bit的

nt数据类型int类型数据所占内存空间为32位。其中有符号整型变量取值范围为-2147483648~2147483647,无符号型整型变量取值范围为0~4294967295U.其限制如下: /* Minimum and maximum values a ‘signed int’ can hold. */ //整形范围 # define INT_MIN (-INT_MAX - 1)

define INT_MAX 2147483647

/* Maximum value an 'unsigned int' can hold.  (Minimum is 0.)  */ 
//无符号整形范围#  define UINT_MAX 4294967295U 

———————————————— 版权声明:本文为CSDN博主「hustyangju」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/hustyangju/article/details/21640011

不是聊 C 语言的 int 是多少… 是 Go 语言… 如果上面的例子在某台机器上输出的 4,那么 TiDB 目前是没法在那台机器上跑的

那跑tidb需要什么样配置的机器?

package main import ( “fmt” “unsafe” ) func main() { var a int var b int64 fmt.Println(unsafe.Sizeof(a)) fmt.Println(unsafe.Sizeof(b)) }

如果有要求位数的话可以定义int64就好了吧?

建议使用 64 位的 linux 进行编译,int 字节必须是 8 ,才可以编译 TiDB 。

我的是64位的Linux,int字节是否是8和很多因素有关,为什么代码中不用int64来定义变量呢?这个输出的就是8,而int一般是4

目前我们是这样支持的,如果需要更详细的 binary 编译方面的解决方法,建议将问题反馈到 Github 中的 TiDB 下面的 issue https://github.com/pingcap/tidb/issues ,这里有 TiDB 的开发人员直接和大家对接TiDB 开发问题。