Kedua konektor MySQL serta MariaDB (yang berbagi warisan yang sama ) dimaksudkan untuk dikompilasi dan digunakan dengan Visual Studio di Windows saja . Anda akan menemukan banyak pertanyaan sebelumnya di StackOverflow mengenai hal itu. Masalah dengan mereka adalah mereka mendefinisikan banyak struktur yang sudah didefinisikan di perpustakaan standar dan kemudian menautkan ke perpustakaan standar juga.
Saya menyarankan Anda untuk beralih ke Visual Studio atau ke sistem Linux . Jika Anda harus menggunakan GCC di bawah Windows, cari konektor lain. Masalah-masalah ini tidak akan diselesaikan dengan mudah. Jika demikian, solusinya tidak mungkin portabel dan mungkin tidak berfungsi dengan versi kedua konektor di masa mendatang. Anda dapat melihat alternatif SQLite dan SQLAPI++ .
Masalah pertama:bilangan bulat dengan lebar tetap
Masalah pertama yang Anda sebutkan sebenarnya terkait dengan jenis bilangan bulat lebar tetap
dan sistem operasi 32-bit yang didefinisikan dalam file header. Ada tipe integer tradisional seperti char
, short
, int
, long
dan long long
tetapi juga bilangan bulat dengan lebar tetap yang disebutkan di atas.
Konektor MySql mendefinisikan int32_t
tipe data di config.h
dan juga pustaka C++ standar mendefinisikannya:MySql mendefinisikan int32_t
dengan tipe data kompiler __int32
typedef __int32 int32_t;
typedef unsigned __int32 uint32_t;
yang ternyata adalah long int
tipe data
typedef long int int32_t;
typedef long unsigned int uint32_t;
sementara perpustakaan standar mendefinisikannya sebagai int
biasa
typedef int int32_t;
typedef unsigned int uint32_t;
long
tipe data bilangan bulat dijamin setidaknya 32-bit :Pada arsitektur 32-bit sebuah long int
adalah 32-bit (seperti int
) sedangkan untuk 64-bit panjangnya berbeda - a long int
adalah 64-bit dan int
hanya 32-bit (lihat di sini
). Ini berarti sebenarnya untuk sistem 32-bit definisi ini harus identik tetapi kompiler menganggapnya bertentangan.
Header MySql dibungkus oleh berbagai definisi (saya memberikan penjelasan di sebelahnya sehingga Anda dapat memahami mengapa solusi yang diusulkan di bawah ini benar-benar berfungsi) yang memutuskan apakah tipe data yang sesuai harus didefinisikan atau tidak
// Only define for 32-bit compilation
#if defined(_WIN32)
// Don't define if this custom flag is activated
#ifndef CPPCONN_DONT_TYPEDEF_MS_TYPES_TO_C99_TYPES
// Do not define for Visual Studio 2010 and later (but use C++ standard library instead)
#if _MSC_VER >= 1600
#include <stdint.h>
#else
// Only define if HAVE_MS_INT32 (another custom flag) is set to true (1)
#ifdef HAVE_MS_INT32
typedef __int32 int32_t;
#endif
// Some more data type defines...
#endif
#endif
#endif
Solusi
Berdasarkan struktur file header yang diberikan di atas, ada beberapa solusi untuk ini. Beberapa mungkin lebih layak sementara yang lain kurang.
-
Jelas Anda bisa tidak menyertakan definisi tipe apa pun di
cstdint
danstdint.h
dan hidup dengan definisi MySql. Ini sebenarnya akan sangat membatasi karena cepat atau lambat kemungkinan besar tajuk pustaka standar lain akan menyertakannya dan mungkin akan memaksa Anda untuk tidak menggunakan pustaka standar sama sekali yang mungkin sangat membatasi. -
Anda dapat mengabaikan rantai alat build 32-bit yang Anda gunakan sama sekali, beralih ke **kompiler 64-bit dan kompilasi untuk 64-bit . Dalam hal ini seharusnya tidak terjadi sebagai header
config.h
di MySql hanya disertakan untuk sistem 32-bit seperti yang dinyatakan di atas! Jika tidak ada alasan bagus bahwa proyek Anda harus 32-bit, itulah yang sebenarnya akan saya lakukan. Berbicara tentang kompiler Anda:Anda tampaknya menggunakan GCC 6.3.0 yang dirilis kembali pada tahun 2016 dan sebenarnya tidak sepenuhnya mendukungC++17
standar bahasa Anda menyuruhnya untuk dikompilasi denganCMAKE_CXX_STANDARD 17
di file CMake Anda. Anda mungkin ingin menggunakan kompiler baru lainnya jika Anda ingin menggunakan fitur C++ 17 secara ekstensif. Jika tidak, C++14 juga tidak terlalu buruk. -
Anda dapat menggunakan Visual Studio 2010 (versi
1600
) atau lebih baru untuk kompilasi seperti dalam hal ini header akan secara otomatis menyertakan definisi dari standar alih-alih mendefinisikan definisinya sendiri. -
Anda dapat menentukan tanda pra-prosesor
#define CPPCONN_DONT_TYPEDEF_MS_TYPES_TO_C99_TYPES
di atas kode Anda (atau di dalam IDE yang Anda gunakan untuk proyek Anda) seolah-olah flag ini disetel keconfig.h
file tidak akan menentukan tipe data apa pun. -
Demikian pula Anda juga dapat menyelesaikannya dengan membuka
MYSQLC~1.0/include/jdbc/cppconn/config.h
dan ubah arahan pra-prosesor dari#define HAVE_MS_INT32 1 #define HAVE_MS_UINT32 1
untuk
#define HAVE_MS_INT32 0 #define HAVE_MS_UINT32 0
Ini akan menonaktifkan definisi yang sesuai untuk semua program yang juga Anda tulis di masa mendatang yang menyertakan header ini.
Masalah kedua:Menautkan ke pustaka yang dikompilasi dengan Visual Studio
Pesan kesalahan kedua yang Anda dapatkan sebenarnya terkait dengan menautkan perpustakaan. Pada perpustakaan Windows yang dikompilasi dengan kompiler yang berbeda umumnya tidak kompatibel. Ini berarti program yang dikompilasi dengan GCC tidak dapat menyertakan pustaka yang dikompilasi dengan Visual Studio. Dalam kasus Anda, DLL dikompilasi dengan Visual Studio dan oleh karena itu penautan ke program GCC Anda gagal.
Seperti yang juga disebutkan di sini
anda dapat memaksa CMake untuk menggunakan MinGW alih-alih Visual Studio dengan cmake -G "MinGW Makefiles"
tapi saya sudah mencobanya dan tidak berfungsi dengan MariaDB atau MySQL.
Menggunakan MSYS2 di MySQL saya mendapatkan kesalahan samar terkait dengan OpenSSL saat di MariaDB mengikuti panduan resmi dan kemudian menggunakan
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -G "MinGW Makefiles" -DCONC_WITH_UNIT_TESTS=Off -DCONC_WITH_MSI=OFF -DWITH_SSL=SCHANNEL .
cmake --build . --config RelWithDebInfo
Saya harus melakukan beberapa modifikasi manual, seperti memodifikasi /src/CArrayImp.h
dan ubah baris 59 menjadi 63 dari
#ifndef _WIN32
# define ZEROI64 0LL
#else
# define ZEROI64 0I64
#endif
untuk
#define ZEROI64 0LL
sebagai 0I64
hanya didefinisikan oleh Visual Studio. Selanjutnya kita harus menghapus instantiasi template di CArray.cpp
tapi saya masih berakhir dengan The system cannot find the path specified.
pesan eror. Demikian pula saya tidak dapat mengkompilasinya di Cygwin.
Alternatif konektor SQL C++
Saya tidak punya solusi untuk masalah terakhir tetapi Anda mungkin ingin melihat alternatif. Anda dapat mengunduh SQLite dari sumber dan kompilasi. Menurut panduan penginstalan dari sumber ini kompatibel dengan MinGW tetapi hanya ringan . Jadi seharusnya Shareware SQLAPI++ . Menurut halaman "Pesanan" mereka versi percobaan untuk Windows berfungsi penuh
Keduanya harus mendukung MySql:mis. lihat di sini .
tl;dr: Gunakan konektor MySQL dan MariaDB di Windows di Visual Studio saja . Jika Anda tidak dapat menggunakan Visual Studio, lihat konektor C++ SQL alternatif seperti SQLite dan SQLAPI++ sebagai gantinya.