Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pustaka MySQL dan MariaDB di C++ menggunakan cmake, mingw

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 dan stdint.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 mendukung C++17 standar bahasa Anda menyuruhnya untuk dikompilasi dengan CMAKE_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 ke config.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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mendapatkan baris pertama dari string sumber daya mysql?

  2. Penataan ulang data kolom di mysql

  3. Instal Apache, MySQL 8 atau MariaDB 10 dan PHP 7 di CentOS 7

  4. Codeigniter:Kolom 'id' dalam klausa urutan ambigu

  5. mencoba untuk mendapatkan jumlah bulan