mingw 構建 mysql-connector-c-6.1.9記錄


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即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM