1、准备工作

首先需要下载mysql-connector-c-6.1.9的源码,然后解压。

然后需要准备编译环境,这里我使用的是msys2(下载地址http://repo.msys2.org/distrib/x86_64/msys2-x86_64-20161025.exe)。

下载安装后执行下面命令:

# 先更新一下(这一步后面可能会报错,只需要关闭终端,再打开重新更新一下即可)
pacman -Syu
# 安装编译需要工具
pacman -S gcc make cmake
# 下面这句也可以不要
# pacman -S mingw-w64-x86_64-extra-cmake-modules
# 再安装一个vim,这个不是必须的
pacman -S vim

全部安装完成之后,即可进入下一步

2、生成makefile

进入解压后的源码目录

执行下面的命令生成`Makefile文件

# 先创建并进入一个构建目录
mkdir build && cd build
# 生成makefile
cmake -G"Unix Makefiles" ..

执行过程中报下面的错误

$ cmake -G"Unix Makefiles"  ..
-- Running cmake version 3.6.2
System is unknown to cmake, create:
Platform/MINGW64_NT-6.2 to use this system, please send your config file to cmake@www.cmake.org so it can be added to cmake
Your CMakeCache.txt file was copied to CopyOfCMakeCache.txt. Please send that file to cmake@www.cmake.org.
-- SIZEOF_VOIDP 8
-- LibMySQL 6.1.9
-- Built from MySQL 5.7.16 sources
-- Packaging as: mysql-connector-c-6.1.9-MINGW64_NT-6.2-unknown
-- Installing to: /usr/local/mysql
CMake Error at configure.cmake:573 (MESSAGE):
No mysys timer support detected!
Call Stack (most recent call first):
CMakeLists.txt:451 (INCLUDE) -- Configuring incomplete, errors occurred!
See also "/z/mysql-connector-c-6.1.9-src/build/CMakeFiles/CMakeOutput.log".
See also "/z/mysql-connector-c-6.1.9-src/build/CMakeFiles/CMakeError.log".

这里提示是Platform/MINGW64_NT-6.2这个系统环境,cmake不知道怎么去创建构建脚本。这里提示让你把生成的CopyOfCmakeCache.txt文件发送到cmake@www.cmake.org,这里就不发了。

根据提示,打开configure.cmake文件,定位到573行,内容如下

IF(NOT HAVE_POSIX_TIMERS AND NOT HAVE_KQUEUE_TIMERS AND NOT WIN32)
MESSAGE(FATAL_ERROR "No mysys timer support detected!")
ENDIF()

既然这里判断出错,那就直接修改这里好了,在文件最前面前面加上下面语句

SET(WIN32 1)
# 后面不是必须的
SET(WIN64 1)
SET(WINDOWS 1)

重新运行cmake -G"Unix Makefiles" ..即可生成Makefile文件。

这样还不够,还需添加下面一句。具体的请看后面编译时候出现的问题描述

add_definitions(-DWIN32=1 -D_WIN32=1 -DWIN64=1 -DWINDOWS=1 -D__USE_W32_SOCKETS=1)

3、编译

编译过程并不是很顺利,中间遇到很多问题需要解决,这里简单的记录一下

问题1

直接执行make命令来生成,结果报如下错误:

[ 74%] Building C object mysys/CMakeFiles/mysys.dir/my_winerr.c.obj
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:34:6: 错误:‘ERROR_INVALID_FUNCTION’未声明(不在函数内)
{ ERROR_INVALID_FUNCTION, EINVAL }, /* 1 */
^~~~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:35:6: 错误:‘ERROR_FILE_NOT_FOUND’未声明(不在函数内)
{ ERROR_FILE_NOT_FOUND, ENOENT }, /* 2 */
^~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:36:6: 错误:‘ERROR_PATH_NOT_FOUND’未声明(不在函数内)
{ ERROR_PATH_NOT_FOUND, ENOENT }, /* 3 */
^~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:37:6: 错误:‘ERROR_TOO_MANY_OPEN_FILES’未声明(不在函数内)
{ ERROR_TOO_MANY_OPEN_FILES, EMFILE }, /* 4 */
^~~~~~~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:38:6: 错误:‘ERROR_ACCESS_DENIED’未声明(不在函数内)
{ ERROR_ACCESS_DENIED, EACCES }, /* 5 */
^~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:39:6: 错误:‘ERROR_INVALID_HANDLE’未声明(不在函数内)
{ ERROR_INVALID_HANDLE, EBADF }, /* 6 */
^~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:40:6: 错误:‘ERROR_ARENA_TRASHED’未声明(不在函数内)
{ ERROR_ARENA_TRASHED, ENOMEM }, /* 7 */
^~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:41:6: 错误:‘ERROR_NOT_ENOUGH_MEMORY’未声明(不在函数内)
{ ERROR_NOT_ENOUGH_MEMORY, ENOMEM }, /* 8 */
^~~~~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:42:6: 错误:‘ERROR_INVALID_BLOCK’未声明(不在函数内)
{ ERROR_INVALID_BLOCK, ENOMEM }, /* 9 */
^~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:43:6: 错误:‘ERROR_BAD_ENVIRONMENT’未声明(不在函数内)
{ ERROR_BAD_ENVIRONMENT, E2BIG }, /* 10 */
^~~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:44:6: 错误:‘ERROR_BAD_FORMAT’未声明(不在函数内)
{ ERROR_BAD_FORMAT, ENOEXEC }, /* 11 */
^~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:45:6: 错误:‘ERROR_INVALID_ACCESS’未声明(不在函数内)
{ ERROR_INVALID_ACCESS, EINVAL }, /* 12 */
^~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:46:6: 错误:‘ERROR_INVALID_DATA’未声明(不在函数内)
{ ERROR_INVALID_DATA, EINVAL }, /* 13 */
^~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:47:6: 错误:‘ERROR_INVALID_DRIVE’未声明(不在函数内)
{ ERROR_INVALID_DRIVE, ENOENT }, /* 15 */
^~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:48:6: 错误:‘ERROR_CURRENT_DIRECTORY’未声明(不在函数内)
{ ERROR_CURRENT_DIRECTORY, EACCES }, /* 16 */
^~~~~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:49:6: 错误:‘ERROR_NOT_SAME_DEVICE’未声明(不在函数内)
{ ERROR_NOT_SAME_DEVICE, EXDEV }, /* 17 */
^~~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:50:6: 错误:‘ERROR_NO_MORE_FILES’未声明(不在函数内)
{ ERROR_NO_MORE_FILES, ENOENT }, /* 18 */
^~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:51:6: 错误:‘ERROR_LOCK_VIOLATION’未声明(不在函数内)
{ ERROR_LOCK_VIOLATION, EACCES }, /* 33 */
^~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:52:6: 错误:‘ERROR_BAD_NETPATH’未声明(不在函数内)
{ ERROR_BAD_NETPATH, ENOENT }, /* 53 */
^~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:53:6: 错误:‘ERROR_NETWORK_ACCESS_DENIED’未声明(不在函数内)
{ ERROR_NETWORK_ACCESS_DENIED, EACCES }, /* 65 */
^~~~~~~~~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:54:6: 错误:‘ERROR_BAD_NET_NAME’未声明(不在函数内)
{ ERROR_BAD_NET_NAME, ENOENT }, /* 67 */
^~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:55:6: 错误:‘ERROR_FILE_EXISTS’未声明(不在函数内)
{ ERROR_FILE_EXISTS, EEXIST }, /* 80 */
^~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:56:6: 错误:‘ERROR_CANNOT_MAKE’未声明(不在函数内)
{ ERROR_CANNOT_MAKE, EACCES }, /* 82 */
^~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:57:6: 错误:‘ERROR_FAIL_I24’未声明(不在函数内)
{ ERROR_FAIL_I24, EACCES }, /* 83 */
^~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:58:6: 错误:‘ERROR_INVALID_PARAMETER’未声明(不在函数内)
{ ERROR_INVALID_PARAMETER, EINVAL }, /* 87 */
^~~~~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:59:6: 错误:‘ERROR_NO_PROC_SLOTS’未声明(不在函数内)
{ ERROR_NO_PROC_SLOTS, EAGAIN }, /* 89 */
^~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:60:6: 错误:‘ERROR_DRIVE_LOCKED’未声明(不在函数内)
{ ERROR_DRIVE_LOCKED, EACCES }, /* 108 */
^~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:61:6: 错误:‘ERROR_BROKEN_PIPE’未声明(不在函数内)
{ ERROR_BROKEN_PIPE, EPIPE }, /* 109 */
^~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:62:6: 错误:‘ERROR_DISK_FULL’未声明(不在函数内)
{ ERROR_DISK_FULL, ENOSPC }, /* 112 */
^~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:63:6: 错误:‘ERROR_INVALID_TARGET_HANDLE’未声明(不在函数内)
{ ERROR_INVALID_TARGET_HANDLE, EBADF }, /* 114 */
^~~~~~~~~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:64:6: 错误:‘ERROR_INVALID_NAME’未声明(不在函数内)
{ ERROR_INVALID_NAME, ENOENT }, /* 123 */
^~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:66:6: 错误:‘ERROR_WAIT_NO_CHILDREN’未声明(不在函数内)
{ ERROR_WAIT_NO_CHILDREN, ECHILD }, /* 128 */
^~~~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:67:6: 错误:‘ERROR_CHILD_NOT_COMPLETE’未声明(不在函数内)
{ ERROR_CHILD_NOT_COMPLETE, ECHILD }, /* 129 */
^~~~~~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:68:6: 错误:‘ERROR_DIRECT_ACCESS_HANDLE’未声明(不在函数内)
{ ERROR_DIRECT_ACCESS_HANDLE, EBADF }, /* 130 */
^~~~~~~~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:69:6: 错误:‘ERROR_NEGATIVE_SEEK’未声明(不在函数内)
{ ERROR_NEGATIVE_SEEK, EINVAL }, /* 131 */
^~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:70:6: 错误:‘ERROR_SEEK_ON_DEVICE’未声明(不在函数内)
{ ERROR_SEEK_ON_DEVICE, EACCES }, /* 132 */
^~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:71:6: 错误:‘ERROR_DIR_NOT_EMPTY’未声明(不在函数内)
{ ERROR_DIR_NOT_EMPTY, ENOTEMPTY }, /* 145 */
^~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:72:6: 错误:‘ERROR_NOT_LOCKED’未声明(不在函数内)
{ ERROR_NOT_LOCKED, EACCES }, /* 158 */
^~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:73:6: 错误:‘ERROR_BAD_PATHNAME’未声明(不在函数内)
{ ERROR_BAD_PATHNAME, ENOENT }, /* 161 */
^~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:74:6: 错误:‘ERROR_MAX_THRDS_REACHED’未声明(不在函数内)
{ ERROR_MAX_THRDS_REACHED, EAGAIN }, /* 164 */
^~~~~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:75:6: 错误:‘ERROR_LOCK_FAILED’未声明(不在函数内)
{ ERROR_LOCK_FAILED, EACCES }, /* 167 */
^~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:76:6: 错误:‘ERROR_ALREADY_EXISTS’未声明(不在函数内)
{ ERROR_ALREADY_EXISTS, EEXIST }, /* 183 */
^~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:77:6: 错误:‘ERROR_FILENAME_EXCED_RANGE’未声明(不在函数内)
{ ERROR_FILENAME_EXCED_RANGE, ENOENT }, /* 206 */
^~~~~~~~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:78:6: 错误:‘ERROR_NESTING_NOT_ALLOWED’未声明(不在函数内)
{ ERROR_NESTING_NOT_ALLOWED, EAGAIN }, /* 215 */
^~~~~~~~~~~~~~~~~~~~~~~~~
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:79:6: 错误:‘ERROR_NOT_ENOUGH_QUOTA’未声明(不在函数内)
{ ERROR_NOT_ENOUGH_QUOTA, ENOMEM } /* 1816 */
^~~~~~~~~~~~~~~~~~~~~~

解决办法:

直接打开my_winerr.c这个文件,可以看到这里是定义了windows系统返回错误码与System V错误码的一个对照表。

struct errentry
{
unsigned long oscode; /* OS return value */
int sysv_errno; /* System V error code */
}; static struct errentry errtable[]= {
{ ERROR_INVALID_FUNCTION, EINVAL }, /* 1 */
{ ERROR_FILE_NOT_FOUND, ENOENT }, /* 2 */
{ ERROR_PATH_NOT_FOUND, ENOENT }, /* 3 */
{ ERROR_TOO_MANY_OPEN_FILES, EMFILE }, /* 4 */
.... 后面省略 ...

**Windows的错误码定义都在WinError.h文件中,所以只需要修改my_winerr.c文件,在前面添加

#include <WinError.h>

即可。

问题2

继续make编译,报如下错误

[ 39%] Building C object mysys/CMakeFiles/mysys.dir/my_winerr.c.obj
In file included from /z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:26:0:
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:37:6: 错误:初始值设定元素不是常量
{ ERROR_INVALID_FUNCTION, EINVAL }, /* 1 */
^
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:37:6: 附注:(在‘errtable[0].oscode’的初始化附近)
/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c:38:6: 错误:初始值设定元素不是常量
{ ERROR_FILE_NOT_FOUND, ENOENT }, /* 2 */

这个错误的原因是因为c编译器不支持函数外动态声明变量和分配空间,但是这里都是宏,应该替换成了字面常量才对。

通过gcc -E预处理以下(预处理需要指定包含路径,这个可以去libmysql/CMakeFiles目录下找flags.cmake文件查看),可以得到下面代码(为了方便,我把行数输出了)

  7309  struct errentry
7310 {
7311 unsigned long oscode;
7312 int sysv_errno;
7313 };
7314
7315 static struct errentry errtable[]= {
7316 {
7317 # 37 "/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c" 3 4
7318 __MSABI_LONG(1)
7319 # 37 "/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c"
7320 ,
7321 # 37 "/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c" 3 4
7322 22
7323 # 37 "/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c"
7324 },
7325 {
7326 # 38 "/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c" 3 4
7327 __MSABI_LONG(2)
7328 # 38 "/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c"
7329 ,
7330 # 38 "/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c" 3 4
7331 2
7332 # 38 "/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c"
7333 },
7334 {
7335 # 39 "/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c" 3 4
7336 __MSABI_LONG(3)
7337 # 39 "/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c"
7338 ,
7339 # 39 "/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c" 3 4
7340 2
7341 # 39 "/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c"
7342 },
7343 {
7344 # 40 "/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c" 3 4
7345 __MSABI_LONG(4)
7346 # 40 "/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c"
7347 ,
7348 # 40 "/z/mysql-connector-c-6.1.9-src/mysys/my_winerr.c" 3 4

解决办法:

这里看到常数被__MSABI_LONG这个宏处理了一次,所以这里把这个宏给去掉即可。

在结构体数组初始化前后分别加上下面语句即可:

// 初始化前加上下面语句
#pragma push_macro("__MSABI_LONG")
#define __MSABI_LONG(x) x // 初始化赋值
static struct errentry errtable[]= {
{ ERROR_INVALID_FUNCTION, EINVAL }, /* 1 */
{ ERROR_FILE_NOT_FOUND, ENOENT }, /* 2 */
.... 省略 ...
{ ERROR_NESTING_NOT_ALLOWED, EAGAIN }, /* 215 */
{ ERROR_NOT_ENOUGH_QUOTA, ENOMEM } /* 1816 */
}; // 初始化后加上下面语句
#undef __MSABI_LONG
#pragma pop_macro("__MSABI_LONG")

再次执行make即可。

问题3

继续编译,报如下错误:

[ 75%] Building C object vio/CMakeFiles/vio.dir/viopipe.c.obj
/z/mysql-connector-c-6.1.9-src/vio/viopipe.c: 在函数‘wait_overlapped_result’中:
/z/mysql-connector-c-6.1.9-src/vio/viopipe.c:21:3: 错误:未知的类型名‘DWORD’
DWORD transferred, wait_status, timeout_ms;
^~~~~
.... 省略更多 ...

这里只需要添加头文件Windows.h即可。

问题4

继续编译,报如下错误

[ 77%] Building C object vio/CMakeFiles/vio.dir/viopipe.c.obj
In file included from /z/mysql-connector-c-6.1.9-src/vio/vio_priv.h:24:0,
from /z/mysql-connector-c-6.1.9-src/vio/viopipe.c:18:
/z/mysql-connector-c-6.1.9-src/include/m_string.h: 在函数‘native_strcasecmp’中:
/z/mysql-connector-c-6.1.9-src/include/my_global.h:779:22: 警告:隐式声明函数‘_stricmp’ [-Wimplicit-function-declaration]
#define strcasecmp _stricmp
^
/z/mysql-connector-c-6.1.9-src/include/my_global.h:779:22: 附注:in definition of macro ‘strcasecmp’
#define strcasecmp _stricmp
^~~~~~~~
/z/mysql-connector-c-6.1.9-src/vio/viopipe.c: 在函数‘wait_overlapped_result’中:
/z/mysql-connector-c-6.1.9-src/vio/viopipe.c:25:38: 警告:signed and unsigned type in conditional expression [-Wsign-compare]
timeout_ms= timeout >= 0 ? timeout : INFINITE;
^
/z/mysql-connector-c-6.1.9-src/vio/viopipe.c:28:39: 错误:‘Vio {或称 struct st_vio}’没有名为‘overlapped’的成员
wait_status= WaitForSingleObject(vio->overlapped.hEvent, timeout_ms);
^~
/z/mysql-connector-c-6.1.9-src/vio/viopipe.c:34:32: 错误:‘Vio {或称 struct st_vio}’没有名为‘hPipe’的成员
if (GetOverlappedResult(vio->hPipe, &vio->overlapped, &transferred, FALSE))
^~
/z/mysql-connector-c-6.1.9-src/vio/viopipe.c:34:45: 错误:‘Vio {或称 struct st_vio}’没有名为‘overlapped’的成员
if (GetOverlappedResult(vio->hPipe, &vio->overlapped, &transferred, FALSE))
^~
/z/mysql-connector-c-6.1.9-src/vio/viopipe.c:40:17: 错误:‘Vio {或称 struct st_vio}’没有名为‘hPipe’的成员
CancelIo(vio->hPipe);

两个警告就先不管了(找具体头文件)。这里后面的报错,应该是Vio这个结构体中的定义问题,需要找到其定义的位置。

可以找到相关的定义在mysql-connector-c-6.1.9-src/include/violite.h文件中的267337之间(就是最后一部分)。

可以看到overlapped成员是否被定义,与_WIN32宏是否被定义有关。

看来是之前生成Makefile的时候没有把widnows下相关的宏定义给加上。

再次修改configure.cmake文件,添加下面语句

add_definitions(-DWIN32=1 -D_WIN32=1 -DWIN64=1 -DWINDOWS=1)

再次运行cmake -G"Unix Makefiles" ..生成编译脚本,然后运行make进行编译

以下的大部分错误,都是由于_WIN32这个宏导致的!!!

问题5

再次遇到如下错误:

[  7%] Building CXX object extra/yassl/CMakeFiles/yassl.dir/src/cert_wrapper.cpp.o
In file included from /usr/include/w32api/winsock2.h:56:0,
from Z:/mysql-connector-c-6.1.9-src/extra/yassl/include/socket_wrapper.hpp:31,
from Z:/mysql-connector-c-6.1.9-src/extra/yassl/include/log.hpp:27,
from Z:/mysql-connector-c-6.1.9-src/extra/yassl/include/yassl_int.hpp:32,
from Z:/mysql-connector-c-6.1.9-src/extra/yassl/src/cert_wrapper.cpp:26:
/usr/include/w32api/psdk_inc/_fd_types.h:100:2: 警告:#warning "fd_set and associated macros have been defined in sys/types. This can cause runtime problems with W32 sockets" [-Wcpp]
#warning "fd_set and associated macros have been defined in sys/types. \
^~~~~~~
In file included from Z:/mysql-connector-c-6.1.9-src/extra/yassl/include/socket_wrapper.hpp:31:0,
from Z:/mysql-connector-c-6.1.9-src/extra/yassl/include/log.hpp:27,
from Z:/mysql-connector-c-6.1.9-src/extra/yassl/include/yassl_int.hpp:32,
from Z:/mysql-connector-c-6.1.9-src/extra/yassl/src/cert_wrapper.cpp:26:
/usr/include/w32api/winsock2.h:995:34: 错误:conflicting declaration of C function ‘int select(int, _types_fd_set*, _types_fd_set*, _types_fd_set*, PTIMEVAL)’
WINSOCK_API_LINKAGE int WSAAPI select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,const PTIMEVAL timeout);
^~~~~~
In file included from /usr/include/sys/types.h:68:0,
from /usr/include/time.h:28,
from Z:/mysql-connector-c-6.1.9-src/extra/yassl/taocrypt/include/asn.hpp:27,
from Z:/mysql-connector-c-6.1.9-src/extra/yassl/include/cert_wrapper.hpp:36,
from Z:/mysql-connector-c-6.1.9-src/extra/yassl/src/cert_wrapper.cpp:25:
/usr/include/sys/select.h:73:5: 附注:previous declaration ‘int select(int, _types_fd_set*, _types_fd_set*, _types_fd_set*, timeval*)’
int select __P ((int __n, fd_set *__readfds, fd_set *__writefds,
^~~~~~
make[2]: *** [extra/yassl/CMakeFiles/yassl.dir/build.make:89:extra/yassl/CMakeFiles/yassl.dir/src/cert_wrapper.cpp.o] 错误 1
make[1]: *** [CMakeFiles/Makefile2:279:extra/yassl/CMakeFiles/yassl.dir/all] 错误 2
make: *** [Makefile:152:all] 错误 2

这次的问题提示很明确,就是fd_setselect函数多处声明冲突的问题。

这个是由于在mingw下有相关的socket定义的问题,这个可以看/usr/include/w32api/psdk_inc/_fd_types.h文件得知。

#ifndef ___WSA_FD_TYPES_H
#define ___WSA_FD_TYPES_H #include <psdk_inc/_socket_types.h> #ifndef FD_SETSIZE
#define FD_SETSIZE 64
#endif #ifndef _SYS_TYPES_FD_SET
/* fd_set may have been defined by the newlib <sys/types.h>
* if __USE_W32_SOCKETS not defined.
*/ typedef struct fd_set
{
u_int fd_count;
SOCKET fd_array[FD_SETSIZE];
} fd_set;

可以看到注释中有if __USE_W32_SOCKETS not defined.一句,这里只需要将其加入Makefile中即可。

我直接修改的configure.cmake文件中之前添加的语句,如下:

add_definitions(-DWIN32=1 -D_WIN32=1 -DWIN64=1 -DWINDOWS=1 -D__USE_W32_SOCKETS=1)

再次生成编译脚本并执行make即可。

问题6

继续编译,又遇到如下问题

[  9%] Building CXX object extra/yassl/CMakeFiles/yassl.dir/src/socket_wrapper.cpp.obj
Z:/mysql-connector-c-6.1.9-src/extra/yassl/src/socket_wrapper.cpp: 在成员函数‘yaSSL::uint yaSSL::Socket::get_ready() const’中:
Z:/mysql-connector-c-6.1.9-src/extra/yassl/src/socket_wrapper.cpp:119:42: 错误:不能将‘int ioctlsocket(SOCKET, int, __ms_u_long*)’的实参‘3’从‘long unsigned int*’转换到‘__ms_u_long* {aka unsigned int*}’
ioctlsocket(socket_, FIONREAD, &ready);
^
make[2]: *** [extra/yassl/CMakeFiles/yassl.dir/build.make:214:extra/yassl/CMakeFiles/yassl.dir/src/socket_wrapper.cpp.obj] 错误 1
make[1]: *** [CMakeFiles/Makefile2:215:extra/yassl/CMakeFiles/yassl.dir/all] 错误 2
make: *** [Makefile:152:all] 错误 2

这里是因为函数ioctlsocket的第三个参数&ready类型为long unsigned int*而不是需要的__ms_u_long* {aka unsigned int*},直接强转即可。

这个很好解决,直接修改mysql-connector-c-6.1.9-src/extra/yassl/src/socket_wrapper.cpp文件中的118行 为如下:

// unsigned long ready = 0;
__ms_u_long ready = 0;

问题7

继续编译,遇到如下问题

[  7%] Building CXX object extra/yassl/CMakeFiles/yassl.dir/src/ssl.cpp.obj
Z:/mysql-connector-c-6.1.9-src/extra/yassl/src/ssl.cpp: 在函数‘char* yaSSL::ya_SSL_ASN1_TIME_to_string(yaSSL::ASN1_STRING*, char*, size_t)’中:
Z:/mysql-connector-c-6.1.9-src/extra/yassl/src/ssl.cpp:1860:42: 错误:‘_snprintf’在此作用域中尚未声明
t.tm_sec, t.tm_year + 1900);
^
make[2]: *** [extra/yassl/CMakeFiles/yassl.dir/build.make:239:extra/yassl/CMakeFiles/yassl.dir/src/ssl.cpp.obj] 错误 1
make[1]: *** [CMakeFiles/Makefile2:215:extra/yassl/CMakeFiles/yassl.dir/all] 错误 2
make: *** [Makefile:152:all] 错误 2

这里可以直接将错误处(mysql-connector-c-6.1.9-src/extra/yassl/src/ssl.cpp的1860行)的_snprintf直接改为snprintf即可。

问题8

继续编译,将遇到一大堆重定义的问题,基本都来自于my_global.h文件中。

这是由于mingw的自带的头文件中与Widnows sSDK中的头文件中的一些定义有冲突(mingw把一些linux上的系统函数进行了实现),这里只需要判断后进行注释掉即可。

下面把有冲突的地方列出来。

[  8%] Building C object extra/yassl/CMakeFiles/yassl.dir/__/__/client/get_password.c.obj

Z:/mysql-connector-c-6.1.9-src/include/my_global.h:134:0: 警告:“O_NONBLOCK”重定义
#define O_NONBLOCK 1 /* For emulation of fcntl() */ /usr/include/sys/_default_fcntl.h:44:0: 附注:这是先前定义的位置
#define O_NONBLOCK _FNONBLOCK In file included from Z:/mysql-connector-c-6.1.9-src/client/get_password.c:20:0:
Z:/mysql-connector-c-6.1.9-src/include/my_global.h:219:19: 错误:与‘sigset_t’类型冲突
typedef int sigset_t;
^~~~~~~~
/usr/include/sys/signal.h:18:20: 附注:‘sigset_t’的上一个声明在此
typedef __sigset_t sigset_t;
^~~~~~~~
In file included from Z:/mysql-connector-c-6.1.9-src/client/get_password.c:20:0:
Z:/mysql-connector-c-6.1.9-src/include/my_global.h:220:19: 错误:与‘mode_t’类型冲突
typedef int mode_t;
^~~~~~
/usr/include/sys/types.h:205:18: 附注:‘mode_t’的上一个声明在此
typedef __mode_t mode_t; /* permissions */
^~~~~~
Z:/mysql-connector-c-6.1.9-src/include/my_global.h:221:19: 错误:与‘ssize_t’类型冲突
typedef SSIZE_T ssize_t;
^~~~~~~
/usr/include/sys/types.h:200:18: 附注:‘ssize_t’的上一个声明在此
typedef _ssize_t ssize_t;
^~~~~~~
In file included from Z:/mysql-connector-c-6.1.9-src/client/get_password.c:20:0:
Z:/mysql-connector-c-6.1.9-src/include/my_global.h:653:1: 错误:对‘localtime_r’的静态声明出现在非静态声明之后
{
^
/usr/include/time.h:81:12: 附注:‘localtime_r’的上一个声明在此
struct tm *_EXFUN(localtime_r, (const time_t *__restrict,
^
In file included from Z:/mysql-connector-c-6.1.9-src/client/get_password.c:20:0:
Z:/mysql-connector-c-6.1.9-src/include/my_global.h: 在函数‘localtime_r’中:
Z:/mysql-connector-c-6.1.9-src/include/my_global.h:654:3: 警告:隐式声明函数‘localtime_s’ [-Wimplicit-function-declaration]
localtime_s(tmp, timep);
^~~~~~~~~~~
Z:/mysql-connector-c-6.1.9-src/include/my_global.h: 在文件作用域:
Z:/mysql-connector-c-6.1.9-src/include/my_global.h:659:1: 错误:对‘gmtime_r’的静态声明出现在非静态声明之后
{
/usr/include/time.h:79:12: 附注:‘gmtime_r’的上一个声明在此
struct tm *_EXFUN(gmtime_r, (const time_t *__restrict,
^

问题9

继续编译,遇到如下问题

[  6%] Building C object extra/yassl/CMakeFiles/yassl.dir/__/__/client/get_password.c.obj
Z:/mysql-connector-c-6.1.9-src/client/get_password.c: 在文件作用域:
Z:/mysql-connector-c-6.1.9-src/client/get_password.c:49:19: 致命错误:conio.h:No such file or directory
#include <conio.h>
^
编译中断。
make[2]: *** [extra/yassl/CMakeFiles/yassl.dir/build.make:364:extra/yassl/CMakeFiles/yassl.dir/__/__/client/get_password.c.obj] 错误 1
make[1]: *** [CMakeFiles/Makefile2:215:extra/yassl/CMakeFiles/yassl.dir/all] 错误 2
make: *** [Makefile:152:all] 错误 2

conio.h这个文件没有,直接下载一个即可http://files.cnblogs.com/files/oloroso/conio.zip

下载完成之后直接放在源码目录的include目录下即可。

问题10

[ 18%] Building CXX object extra/yassl/taocrypt/CMakeFiles/taocrypt.dir/src/random.cpp.obj
Z:/mysql-connector-c-6.1.9-src/extra/yassl/taocrypt/src/random.cpp: 在构造函数‘TaoCrypt::OS_Seed::OS_Seed()’中:
Z:/mysql-connector-c-6.1.9-src/extra/yassl/taocrypt/src/random.cpp:76:29: 错误:从类型‘TaoCrypt::OS_Seed::ProviderHandle* {aka long unsigned int*}’到类型‘HCRYPTPROV* {aka long long unsigned int*}’的转换无效 [-fpermissive]
if(!CryptAcquireContext(&handle_, 0, 0, PROV_RSA_FULL,
^~~~~~~~

直接强转即可。

问题11

[ 52%] Building C object mysys/CMakeFiles/mysys.dir/my_create.c.obj
......
Z:/mysql-connector-c-6.1.9-src/mysys/my_create.c:23:19: 致命错误:share.h:No such file or directory
#include <share.h>
^
编译中断。
make[2]: *** [mysys/CMakeFiles/mysys.dir/build.make:964:mysys/CMakeFiles/mysys.dir/my_create.c.obj] 错误 1
make[1]: *** [CMakeFiles/Makefile2:597:mysys/CMakeFiles/mysys.dir/all] 错误 2
make: *** [Makefile:152:all] 错误 2

直接打开my_create.c定位到#include <share.h>将其注释掉即可。

问题12

[ 38%] Building C object mysys/CMakeFiles/mysys.dir/my_fopen.c.obj
....
Z:/mysql-connector-c-6.1.9-src/mysys/my_fopen.c:130:35: 错误:‘_O_APPEND’未声明(在此函数内第一次使用)
_O_APPEND | _O_TEXT)) == -1)
^~~~~~~~~
Z:/mysql-connector-c-6.1.9-src/mysys/my_fopen.c:130:35: 附注:每个未声明的标识符在其出现的函数内只报告一次
Z:/mysql-connector-c-6.1.9-src/mysys/my_fopen.c:130:47: 错误:‘_O_TEXT’未声明(在此函数内第一次使用)
_O_APPEND | _O_TEXT)) == -1)
^~~~~~~
Z:/mysql-connector-c-6.1.9-src/mysys/my_fopen.c:136:7: 警告:隐式声明函数‘_dup2’ [-Wimplicit-function-declaration]
if (_dup2(handle_fd, fd) < 0)
^~~~~
make[2]: *** [mysys/CMakeFiles/mysys.dir/build.make:1089:mysys/CMakeFiles/mysys.dir/my_fopen.c.obj] 错误 1
make[1]: *** [CMakeFiles/Makefile2:597:mysys/CMakeFiles/mysys.dir/all] 错误 2
make: *** [Makefile:152:all] 错误 2

_O_APPEND_O_TEXT改为O_APPENDO_TEXT即可。

问题13

[ 39%] Building C object mysys/CMakeFiles/mysys.dir/my_gethwaddr.c.obj
.......
In file included from /usr/include/w32api/iprtrmib.h:12:0,
from /usr/include/w32api/iphlpapi.h:15, from Z:/mysql-connector-c-6.1.9-src/mysys/my_gethwaddr.c:141:
/usr/include/w32api/mprapi.h: 在文件作用域:
/usr/include/w32api/mprapi.h:869:3: 错误:未知的类型名‘CERT_NAME_BLOB’
CERT_NAME_BLOB *certificateNames;
^~~~~~~~~~~~~~
/usr/include/w32api/mprapi.h:891:3: 错误:未知的类型名‘CRYPT_HASH_BLOB’
CRYPT_HASH_BLOB certBlob;
^~~~~~~~~~~~~~~
make[2]: *** [mysys/CMakeFiles/mysys.dir/build.make:1139:mysys/CMakeFiles/mysys.dir/my_gethwaddr.c.obj] 错误 1
make[1]: *** [CMakeFiles/Makefile2:597:mysys/CMakeFiles/mysys.dir/all] 错误 2
make: *** [Makefile:152:all] 错误 2

直接打开文件/usr/include/w32api/iprtrmib.h将第12行的#include <mprapi.h>给注释掉。

问题14

In file included from /usr/include/w32api/iphlpapi.h:15:0,
from Z:/mysql-connector-c-6.1.9-src/mysys/my_gethwaddr.c:141:
/usr/include/w32api/iprtrmib.h: 在文件作用域:
/usr/include/w32api/iprtrmib.h:81:17: 错误:‘MAX_INTERFACE_NAME_LEN’未声明(不在函数内)
WCHAR wszName[MAX_INTERFACE_NAME_LEN];
^~~~~~~~~~~~~~~~~~~~~~
make[2]: *** [mysys/CMakeFiles/mysys.dir/build.make:1139:mysys/CMakeFiles/mysys.dir/my_gethwaddr.c.obj] 错误 1

直接打开文件/usr/include/w32api/iprtrmib.h,在最前面添加宏定义宏#define MAX_INTERFACE_NAME_LEN 512

问题15

Z:/mysql-connector-c-6.1.9-src/mysys/my_getwd.c: 在文件作用域:
Z:/mysql-connector-c-6.1.9-src/mysys/my_getwd.c:25:17: 致命错误:dos.h:No such file or directory
#include <dos.h>
^
编译中断。
make[2]: *** [mysys/CMakeFiles/mysys.dir/build.make:1189:mysys/CMakeFiles/mysys.dir/my_getwd.c.obj] 错误 1

这里直接将my_getwd.c文件中的25、26行都注释掉(include <dos.h>include <direct.h>

问题16

Z:/mysql-connector-c-6.1.9-src/mysys/my_init.c:30:20: 致命错误:crtdbg.h:No such file or directory
#include <crtdbg.h>
^
编译中断。
make[2]: *** [mysys/CMakeFiles/mysys.dir/build.make:1239:mysys/CMakeFiles/mysys.dir/my_init.c.obj] 错误 1

直接注释掉这个头文件的包含

问题17

Z:/mysql-connector-c-6.1.9-src/mysys/my_init.c: 在函数‘my_end’中:
Z:/mysql-connector-c-6.1.9-src/mysys/my_init.c:189:4: 警告:隐式声明函数‘_CrtSetReportMode’ [-Wimplicit-function-declaration]
_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
^~~~~~~~~~~~~~~~~
Z:/mysql-connector-c-6.1.9-src/mysys/my_init.c:189:23: 错误:‘_CRT_WARN’未声明(在此函数内第一次使用)
_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
^~~~~~~~~
Z:/mysql-connector-c-6.1.9-src/mysys/my_init.c:189:23: 附注:每个未声明的标识符在其出现的函数内只报告一次
Z:/mysql-connector-c-6.1.9-src/mysys/my_init.c:189:34: 错误:‘_CRTDBG_MODE_FILE’未声明(在此函数内第一次使用)
_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
^~~~~~~~~~~~~~~~~
Z:/mysql-connector-c-6.1.9-src/mysys/my_init.c:190:4: 警告:隐式声明函数‘_CrtSetReportFile’ [-Wimplicit-function-declaration]
_CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDERR );
^~~~~~~~~~~~~~~~~
Z:/mysql-connector-c-6.1.9-src/mysys/my_init.c:190:34: 错误:‘_CRTDBG_FILE_STDERR’未声明(在此函数内第一次使用)
_CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDERR );
^~~~~~~~~~~~~~~~~~~
Z:/mysql-connector-c-6.1.9-src/mysys/my_init.c:191:23: 错误:‘_CRT_ERROR’未声明(在此函数内第一次使用)
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
^~~~~~~~~~
Z:/mysql-connector-c-6.1.9-src/mysys/my_init.c:193:23: 错误:‘_CRT_ASSERT’未声明(在此函数内第一次使用)
_CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );

直接定位到my_init.c文件的188行,做如下修改

// #if defined(_WIN32) 修改为下面语句
#if defined(_WIN32) && defined(_MSC_VER)

问题18

Z:/mysql-connector-c-6.1.9-src/mysys/my_lib.c: 在函数‘my_dir’中:
Z:/mysql-connector-c-6.1.9-src/mysys/my_lib.c:220:22: 错误:‘find’的存储大小未知
struct _finddata_t find;
^~~~
Z:/mysql-connector-c-6.1.9-src/mysys/my_lib.c:269:15: 警告:隐式声明函数‘_findfirst’ [-Wimplicit-function-declaration]
if ((handle=_findfirst(tmp_path,&find)) == -1L)
^~~~~~~~~~
Z:/mysql-connector-c-6.1.9-src/mysys/my_lib.c:291:21: 错误:‘_A_HIDDEN’未声明(在此函数内第一次使用)
if (attrib & (_A_HIDDEN | _A_SYSTEM))
^~~~~~~~~
Z:/mysql-connector-c-6.1.9-src/mysys/my_lib.c:291:21: 附注:每个未声明的标识符在其出现的函数内只报告一次
Z:/mysql-connector-c-6.1.9-src/mysys/my_lib.c:291:33: 错误:‘_A_SYSTEM’未声明(在此函数内第一次使用)
if (attrib & (_A_HIDDEN | _A_SYSTEM))
^~~~~~~~~
Z:/mysql-connector-c-6.1.9-src/mysys/my_lib.c:304:24: 错误:‘_A_RDONLY’未声明(在此函数内第一次使用)
if (!(attrib & _A_RDONLY))
^~~~~~~~~
Z:/mysql-connector-c-6.1.9-src/mysys/my_lib.c:306:22: 错误:‘_A_SUBDIR’未声明(在此函数内第一次使用)
if (attrib & _A_SUBDIR)
^~~~~~~~~

这个问题不是很好解决,在/usr/include/C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include下的头文件中都找不到相关定义。

既然是mingw下,那就可以使用非Windows的实现。

打开my_lib.c文件做如下修改:

// 在26行左右位置的 #if defined(HAVE_DIRENT_H)前添加
#define HAVE_DIR_ENT_H 1
#include <sys/types.h> // 将77行左右位置的 #if !defined(_WIN32)修改为
#if 1

问题19

Z:/mysql-connector-c-6.1.9-src/mysys/my_mkdir.c:23:20: 致命错误:direct.h:No such file or directory
#include <direct.h>
^
编译中断。
make[2]: *** [mysys/CMakeFiles/mysys.dir/build.make:1364:mysys/CMakeFiles/mysys.dir/my_mkdir.c.obj] 错误 1

#include <direct.h>给注释掉即可

问题20

Z:/mysql-connector-c-6.1.9-src/mysys/my_mkdir.c: 在函数‘my_mkdir’中:
Z:/mysql-connector-c-6.1.9-src/mysys/my_mkdir.c:32:7: 错误:提供给函数‘mkdir’的实参太少
if (mkdir((char*) dir))
^~~~~

这里直接将32行前的#if defined(_WIN32)修改为#if defined(_WIN32) && defined(_MSC_VER)即可

问题21

Z:/mysql-connector-c-6.1.9-src/mysys/my_thr_init.c:455:25: 错误:‘_CALL_REPORTFAULT’未声明(在此函数内第一次使用)
_set_abort_behavior(0,_CALL_REPORTFAULT);
^~~~~~~~~~~~~~~~~

_CALL_REPORTFAULT的定义在stdlib.h中,但是这个是在VS下才有,具体定义如下

// Argument values for _set_abort_behavior().
#define _WRITE_ABORT_MSG 0x1 // debug only, has no effect in release
#define _CALL_REPORTFAULT 0x2

这里直接将其修改为0x2了。

问题22

Z:/mysql-connector-c-6.1.9-src/mysys/stacktrace.c: 在函数‘my_safe_puts_stderr’中:
Z:/mysql-connector-c-6.1.9-src/mysys/stacktrace.c:552:3: 错误:‘__try’未声明(在此函数内第一次使用)
__try
^~~~~
Z:/mysql-connector-c-6.1.9-src/mysys/stacktrace.c:552:3: 附注:每个未声明的标识符在其出现的函数内只报告一次
Z:/mysql-connector-c-6.1.9-src/mysys/stacktrace.c:553:3: 错误:expected ‘;’ before ‘{’ token
{
^

这是windows的seh异常捕捉不被支持,直接注释掉即可(修改my_safe_puts_stderr函数如下)

void my_safe_puts_stderr(const char *val, size_t len)
{
//__try
{
my_write_stderr(val, len);
my_safe_printf_stderr("%s", "\n");
}
//__except(EXCEPTION_EXECUTE_HANDLER)
{
// my_safe_printf_stderr("%s", "is an invalid string pointer\n");
}
}

问题23

[ 43%] Building C object mysys/CMakeFiles/mysys.dir/lf_alloc-pin.c.obj
In file included from Z:/mysql-connector-c-6.1.9-src/include/lf.h:20:0,
from Z:/mysql-connector-c-6.1.9-src/mysys/lf_alloc-pin.c:98:
Z:/mysql-connector-c-6.1.9-src/include/my_atomic.h:64:4: 错误:#error Native atomics support not found!
# error Native atomics support not found!
^~~~~

原生原子变量支持没有找到,这里直接注释掉 # error Native atomics support not found!这句

问题24

Z:/mysql-connector-c-6.1.9-src/mysys/my_winfile.c:51:19: 致命错误:share.h:No such file or directory
#include <share.h>

这里直接将文件开头出的#ifdef _WIN32改为#if 0算了,不然还会有一堆错误。

问题24

[ 81%] Building CXX object mysys_ssl/CMakeFiles/mysys_ssl.dir/crypt_genhash_impl.cc.obj
In file included from Z:/mysql-connector-c-6.1.9-src/mysys_ssl/crypt_genhash_impl.cc:32:0:
Z:/mysql-connector-c-6.1.9-src/include/m_string.h: 在函数‘longlong my_strtoll(const char*, char**, int)’中:
Z:/mysql-connector-c-6.1.9-src/include/m_string.h:115:38: 错误:‘_strtoi64’在此作用域中尚未声明
return _strtoi64(nptr, endptr, base);
^
Z:/mysql-connector-c-6.1.9-src/include/m_string.h: 在函数‘ulonglong my_strtoull(const char*, char**, int)’中:
Z:/mysql-connector-c-6.1.9-src/include/m_string.h:124:39: 错误:‘_strtoui64’在此作用域中尚未声明
return _strtoui64(nptr, endptr, base);
^
Z:/mysql-connector-c-6.1.9-src/include/m_string.h: 在函数‘char* my_strtok_r(char*, const char*, char**)’中:
Z:/mysql-connector-c-6.1.9-src/include/m_string.h:133:38: 错误:‘strtok_s’在此作用域中尚未声明
return strtok_s(str, delim, saveptr);
^
Z:/mysql-connector-c-6.1.9-src/include/m_string.h: 在函数‘int native_strcasecmp(const char*, const char*)’中:
Z:/mysql-connector-c-6.1.9-src/include/m_string.h:143:25: 错误:‘_stricmp’在此作用域中尚未声明
return _stricmp(s1, s2);
^
Z:/mysql-connector-c-6.1.9-src/include/m_string.h: 在函数‘int native_strncasecmp(const char*, const char*, size_t)’中:
Z:/mysql-connector-c-6.1.9-src/include/m_string.h:153:29: 错误:‘_strnicmp’在此作用域中尚未声明
return _strnicmp(s1, s2, n);
^
make[2]: *** [mysys_ssl/CMakeFiles/mysys_ssl.dir/build.make:64:mysys_ssl/CMakeFiles/mysys_ssl.dir/crypt_genhash_impl.cc.obj] 错误 1

这里直接打开m_string.h文件,将其中的#if defined _WIN32后面都加上&& defined(_MSC_VER)即可。

问题25

[ 81%] Building CXX object mysys_ssl/CMakeFiles/mysys_ssl.dir/crypt_genhash_impl.cc.obj
In file included from Z:/mysql-connector-c-6.1.9-src/mysys_ssl/crypt_genhash_impl.cc:32:0:
Z:/mysql-connector-c-6.1.9-src/include/m_string.h: 在函数‘int native_strcasecmp(const char*, const char*)’中:
Z:/mysql-connector-c-6.1.9-src/include/m_string.h:145:27: 错误:‘_stricmp’在此作用域中尚未声明
return strcasecmp(s1, s2);
^
make[2]: *** [mysys_ssl/CMakeFiles/mysys_ssl.dir/build.make:64:mysys_ssl/CMakeFiles/mysys_ssl.dir/crypt_genhash_impl.cc.obj] 错误 1

这是上面修改没有完善的问题,这里直接自己实现。我这里直接抄写的linux下的实现(为避免重定义,可以在crypt_genhash_impl.cc中去实现,这里只引用一下即可)

typedef unsigned char u_char;
static const u_char charmap[] = {
000, 001, 002, 003, 004, 005, 006, 007,
010, 011, 012, 013, 014, 015, 016, 017,
020, 021, 022, 023, 024, 025, 026, 027,
030, 031, 032, 033, 034, 035, 036, 037,
040, 041, 042, 043, 044, 045, 046, 047,
050, 051, 052, 053, 054, 055, 056, 057,
060, 061, 062, 063, 064, 065, 066, 067,
070, 071, 072, 073, 074, 075, 076, 077,
0100, 0141, 0142, 0143, 0144, 0145, 0146, 0147,
0150, 0151, 0152, 0153, 0154, 0155, 0156, 0157,
0160, 0161, 0162, 0163, 0164, 0165, 0166, 0167,
0170, 0171, 0172, 0133, 0134, 0135, 0136, 0137,
0140, 0141, 0142, 0143, 0144, 0145, 0146, 0147,
0150, 0151, 0152, 0153, 0154, 0155, 0156, 0157,
0160, 0161, 0162, 0163, 0164, 0165, 0166, 0167,
0170, 0171, 0172, 0173, 0174, 0175, 0176, 0177,
0200, 0201, 0202, 0203, 0204, 0205, 0206, 0207,
0210, 0211, 0212, 0213, 0214, 0215, 0216, 0217,
0220, 0221, 0222, 0223, 0224, 0225, 0226, 0227,
0230, 0231, 0232, 0233, 0234, 0235, 0236, 0237,
0240, 0241, 0242, 0243, 0244, 0245, 0246, 0247,
0250, 0251, 0252, 0253, 0254, 0255, 0256, 0257,
0260, 0261, 0262, 0263, 0264, 0265, 0266, 0267,
0270, 0271, 0272, 0273, 0274, 0275, 0276, 0277,
0300, 0301, 0302, 0303, 0304, 0305, 0306, 0307,
0310, 0311, 0312, 0313, 0314, 0315, 0316, 0317,
0320, 0321, 0322, 0323, 0324, 0325, 0326, 0327,
0330, 0331, 0332, 0333, 0334, 0335, 0336, 0337,
0340, 0341, 0342, 0343, 0344, 0345, 0346, 0347,
0350, 0351, 0352, 0353, 0354, 0355, 0356, 0357,
0360, 0361, 0362, 0363, 0364, 0365, 0366, 0367,
0370, 0371, 0372, 0373, 0374, 0375, 0376, 0377
}; int
xxxxx_strcasecmp(const char *s1, const char *s2)
{
const u_char *cm = charmap,
*us1 = (const u_char *)s1,
*us2 = (const u_char *)s2; while (cm[*us1] == cm[*us2++])
if (*us1++ == '\0')
return (0);
return (cm[*us1] - cm[*--us2]);
} int
xxxx_strncasecmp(const char *s1, const char *s2, size_t n)
{
if (n != 0) {
const u_char *cm = charmap,
*us1 = (const u_char *)s1,
*us2 = (const u_char *)s2; do {
if (cm[*us1] != cm[*us2++])
return (cm[*us1] - cm[*--us2]);
if (*us1++ == '\0')
break;
} while (--n != 0);
}
return (0);
}

问题26

Z:/mysql-connector-c-6.1.9-src/mysys_ssl/my_default.cc: 在函数‘size_t my_get_system_windows_directory(char*, size_t)’中:
Z:/mysql-connector-c-6.1.9-src/mysys_ssl/my_default.cc:1344:58: 错误:‘stricmp’在此作用域中尚未声明
if (count > 8 && stricmp(buffer+(count-8), "\\System32") == 0)
^
make[2]: *** [mysys_ssl/CMakeFiles/mysys_ssl.dir/build.make:114:mysys_ssl/CMakeFiles/mysys_ssl.dir/my_default.cc.obj] 错误 1

这里将stricmp改为strcasecmp即可。

mingw 构建 mysql-connector-c-6.1.9记录的更多相关文章

  1. [转]MySQL Connector/C++(一)

    http://www.cnblogs.com/dvwei/archive/2013/04/18/3029464.html#undefined#undefined MySQL Connector/C++ ...

  2. MySQL Connector/C++ 8.0 源码编译

    平台 ubuntu 16.04 参考文档: https://dev.mysql.com/doc/dev/connector-cpp/8.0/building.html 下载源码 访问 https:// ...

  3. MySQL Connector/Python 接口 (一)

    这里仅介绍 MySQL 官方开发的 Python 接口,参见这里: https://dev.mysql.com/doc/connector-python/en/ Chapter 1 Introduct ...

  4. 创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL

    创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL 用惯.NET的研发人员都习惯性地使用SQLServer作为数据库.然而.NET Core ...

  5. vc++2013中使用MySQL connector/C++ 1.1.4静态链接报错

    包含头文件 #include <mysql_connection.h> #include <mysql_driver.h> #include <cppconn/state ...

  6. Using MySQL Connector .NET 6.6.4 with Entity Framework 5

    I had been waiting for the latest MySQL connector for .NET to come out so I can move on to the new a ...

  7. mysql.connector操作mysql的blob值

    This tutorial shows you how to work with MySQL BLOB data in Python, with examples of updating and re ...

  8. Ubuntu & MacOS安装Mysql & connector

    Ubuntu & MacOS安装Mysql & connector 1. 安装MySql sudo apt-get install mysql-server apt-get insta ...

  9. Snippet: Fetching results after calling stored procedures using MySQL Connector/Python

    https://geert.vanderkelen.org/2014/results-after-procedure-call/ Problem Using MySQL Connector/Pytho ...

  10. MySQL Connector/J 6.x jdbc.properties 配置, mysql-connector-java-6.0.4.jar 异常

    今天学习SSM框架整合,完成Spring和mybatis这两大框架的整合做测试时候出来很多问题,主要来自于配置文件. 我这里重点说一下Mysql数据驱动配置. 配置pom.xml时候去网站 MySQL ...

随机推荐

  1. caffe中的学习率的衰减机制

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Julialove102123/article/details/79200158 根据  caffe/ ...

  2. 迪米特法则(Law Of Demeter)

    定义:一个对象应该对其他对象保持最少的了解. 问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大. 解决方案:尽量降低类与类之间的耦合. 自从我们接触编程开始,就 ...

  3. 从数据库中取 datetime类型,界面展示 yyyy-MM-dd

    //处理提问时间,去掉时分秒 if(array!=null && array.size()>0){ for(int i=0;i<array.size();i++){ JSO ...

  4. Is there anyway to discover which ip addresses are connected to the db?

    From mongo shell run db.currentOp() to show all active connections or db.currentOp(true) to show all ...

  5. [Algorithm] Circular buffer

    You run an e-commerce website and want to record the last N order ids in a log. Implement a data str ...

  6. 详解使用DockerHub官方的mysql镜像生成容器

    详解使用DockerHub官方的mysql镜像生成容器 收藏 yope 发表于 10个月前 阅读 1506 收藏 32 点赞 1 评论 0 腾讯云·云上实验室:开发者零门槛,免费使用真机在线实验!&g ...

  7. 解决Android Studio提示gradle project sync failed报错的解决方法

    运行的时候报错,提示:gradle project sync failed 1.打开AS,切换到project目录结构依次进入目录app->gradle->gradle-wrapper.p ...

  8. SpringBoot添加对Mybatis分页插件PageHelper的支持

    1.修改maven配置文件pom.xml,添加对pageHelper的支持: <!--pagehelper--> <dependency> <groupId>com ...

  9. select/poll/epoll 对比

    前两篇文章介绍了select,poll,epoll的基本用法,现在我们来看看它们的区别和适用场景. 首先还是来看常见的select和poll.对于网络编程来说,一般认为poll比select要高级一些 ...

  10. CSS外框高度自动适应

    当有浮动float时,最外框会不跟随内容的高度而高: 解决办法一:清除浮动  clear:both <!DOCTYPE html> <html xmlns="http:// ...