Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

cmake, mingw . का उपयोग करके MySQL और MariaDB लाइब्रेरी C++ में हैं

दोनों कनेक्टर MySQL और साथ ही MariaDB (जो एक ही विरासत साझा करते हैं ) केवल विंडोज़ पर विजुअल स्टूडियो के साथ संकलित और उपयोग किए जाने के लिए अभिप्रेत हैं . आपको इसके बारे में StackOverflow पर पिछले कई प्रश्न मिलेंगे। उनके साथ समस्या यह है कि वे बहुत सारी संरचनाओं को परिभाषित करते हैं जो पहले से ही मानक पुस्तकालय में परिभाषित हैं और फिर मानक पुस्तकालय से भी जुड़ते हैं।

मेरा सुझाव है कि आप विजुअल स्टूडियो या किसी Linux सिस्टम में स्विच करें . अगर आपको विंडोज के तहत जीसीसी का इस्तेमाल करना है तो दूसरे कनेक्टर की तलाश करें। इन समस्याओं का समाधान आसानी से नहीं होगा। यदि ऐसा है तो समाधान पोर्टेबल होने की संभावना नहीं है और हो सकता है कि दो कनेक्टरों के भविष्य के संस्करणों के साथ काम न करें। आप विकल्प SQLite पर एक नज़र डाल सकते हैं और SQLAPI++

पहली समस्या:निश्चित-चौड़ाई वाले पूर्णांक

आपके द्वारा बताई गई पहली समस्या वास्तव में निश्चित-चौड़ाई वाले पूर्णांक प्रकारों से संबंधित है। और हेडर-फाइलों में परिभाषित 32-बिट ऑपरेटिंग सिस्टम। पारंपरिक पूर्णांक प्रकार हैं जैसे char , short , int , long और long long लेकिन इसके अतिरिक्त उपरोक्त निश्चित-चौड़ाई वाले पूर्णांक।

MySql कनेक्टर int32_t . को परिभाषित करता है config.h . में डेटा प्रकार और मानक C++ लाइब्रेरी भी उन्हें परिभाषित करती है:MySql int32_t . को परिभाषित करता है कंपाइलर डेटा प्रकार के साथ __int32

typedef __int32 int32_t;
typedef unsigned __int32 uint32_t;

जो आश्चर्यजनक रूप से long int . निकला डेटा प्रकार

typedef long int int32_t;
typedef long unsigned int uint32_t;

जबकि मानक पुस्तकालय उन्हें नियमित int . के रूप में परिभाषित कर रहा है

typedef int int32_t;
typedef unsigned int uint32_t;

long पूर्णांक डेटा प्रकार कम से कम 32-बिट होने की गारंटी है :32-बिट आर्किटेक्चर पर long int 32-बिट है (बिल्कुल int . की तरह) ) जबकि 64-बिट के लिए उनकी अलग-अलग लंबाई होती है - एक long int 64-बिट है और एक int है केवल 32-बिट है (देखें यहाँ ) इसका मतलब है कि वास्तव में 32-बिट सिस्टम के लिए ये परिभाषाएं समान होनी चाहिए लेकिन फिर भी कंपाइलर को लगता है कि वे परस्पर विरोधी हैं।

MySql शीर्षलेख विभिन्न परिभाषाओं से लिपटा हुआ है (मैंने उनके आगे एक स्पष्टीकरण दिया है ताकि आप समझ सकें कि नीचे दिए गए प्रस्तावित समाधान वास्तव में क्यों काम करते हैं) जो यह तय करते हैं कि संबंधित डेटा प्रकारों को परिभाषित किया जाना चाहिए या नहीं

// 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

समाधान

ऊपर दी गई हेडर फ़ाइल की संरचना के आधार पर इसके लिए कुछ समाधान हैं। कुछ अधिक व्यवहार्य हो सकते हैं जबकि अन्य कम।

  • स्पष्ट रूप से आप cstdint में किसी भी प्रकार की परिभाषा को शामिल नहीं कर सकते हैं और stdint.h और MySQL परिभाषित के साथ रहते हैं। यह वास्तव में काफी सीमित होगा क्योंकि जल्द या बाद में एक और मानक पुस्तकालय शीर्षलेख में इसे शामिल किया जाएगा और इसके परिणामस्वरूप आपको मानक पुस्तकालय का उपयोग न करने के लिए मजबूर होना पड़ सकता है जो बहुत सीमित हो सकता है।

  • आप जिस 32-बिट बिल्ड टूल-चेन का पूरी तरह से उपयोग कर रहे हैं उसे छोड़ सकते हैं, **64-बिट कंपाइलर पर स्विच कर सकते हैं और 64-बिट के लिए संकलित कर सकते हैं। . इस मामले में यह शीर्ष लेख के रूप में नहीं होना चाहिए config.h जैसा कि ऊपर बताया गया है, MySQL में केवल 32-बिट सिस्टम के लिए शामिल है! यदि कोई अच्छा कारण नहीं है कि आपकी परियोजना 32-बिट होनी चाहिए, तो मैं वास्तव में यही करूंगा। अपने कंपाइलर के बारे में बात करते हुए:आप जीसीसी 6.3.0 का उपयोग कर रहे हैं जो 2016 में जारी किया गया था और वास्तव में C++17 का पूरी तरह से समर्थन नहीं करता भाषा मानक आप इसे CMAKE_CXX_STANDARD 17 . के साथ संकलित करने के लिए कह रहे हैं आपकी सीएमके-फाइल में। यदि आप सी ++ 17 सुविधाओं का व्यापक रूप से उपयोग करना चाहते हैं तो आप एक और नए कंपाइलर का उपयोग करना चाहेंगे। नहीं तो C++14 भी बहुत खराब नहीं है।

  • आप विजुअल स्टूडियो 2010 का उपयोग कर सकते हैं (संस्करण 1600 ) या बाद में संकलन के लिए जैसा कि इस मामले में हैडर स्वचालित रूप से अपने स्वयं के परिभाषित करने के बजाय मानक से परिभाषाओं को शामिल करेगा।

  • आप प्री-प्रोसेसर फ़्लैग को परिभाषित कर सकते हैं #define CPPCONN_DONT_TYPEDEF_MS_TYPES_TO_C99_TYPES आपके कोड के शीर्ष पर (या आईडीई के अंदर आप अपने प्रोजेक्ट के लिए उपयोग कर रहे हैं) जैसे कि यह ध्वज सेट है config.h फ़ाइल किसी भी डेटा प्रकार को परिभाषित नहीं करेगी।

  • इसी तरह आप इसे MYSQLC~1.0/include/jdbc/cppconn/config.h खोलकर भी हल कर सकते हैं। और प्री-प्रोसेसर निर्देशों को संशोधित करें से

    #define HAVE_MS_INT32  1
    #define HAVE_MS_UINT32 1
    

    करने के लिए

    #define HAVE_MS_INT32  0
    #define HAVE_MS_UINT32 0
    

    यह उन सभी प्रोग्रामों के लिए संबंधित परिभाषाओं को निष्क्रिय कर देगा जिन्हें आप भविष्य में भी लिख रहे हैं जिनमें यह हेडर शामिल है।

दूसरी समस्या:विजुअल स्टूडियो के साथ संकलित पुस्तकालयों से लिंक करना

आपको प्राप्त होने वाला दूसरा त्रुटि संदेश वास्तव में पुस्तकालय को जोड़ने से संबंधित है। विंडोज़ पर विभिन्न कंपाइलरों के साथ संकलित पुस्तकालय आम तौर पर संगत नहीं होते हैं। इसका मतलब है कि जीसीसी के साथ संकलित कार्यक्रम में विजुअल स्टूडियो के साथ संकलित पुस्तकालय शामिल नहीं हो सकते हैं। आपके मामले में डीएलएल को विजुअल स्टूडियो के साथ संकलित किया गया था और इसलिए आपके जीसीसी प्रोग्राम से लिंकिंग विफल हो जाती है।

जैसा कि यहां बताया गया है आप सीएमके को विजुअल स्टूडियो के बजाय मिनजीडब्ल्यू का उपयोग करने के लिए मजबूर कर सकते हैं cmake -G "MinGW Makefiles" लेकिन मैंने इसे आजमाया है और यह न तो मारियाडीबी और न ही MySQL के साथ काम करता है।

MSYS2 का उपयोग करना MySQL में मुझे OpenSSL से संबंधित एक गुप्त त्रुटि मिलती है, जबकि MariaDB पर आधिकारिक मार्गदर्शिका और फिर उपयोग कर रहे हैं

cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -G "MinGW Makefiles" -DCONC_WITH_UNIT_TESTS=Off -DCONC_WITH_MSI=OFF -DWITH_SSL=SCHANNEL .
cmake --build . --config RelWithDebInfo

मुझे कुछ मैन्युअल संशोधन करने हैं, जैसे /src/CArrayImp.h को संशोधित करना और लाइन 59 से 63 में बदलें

#ifndef _WIN32
# define ZEROI64 0LL
#else
# define ZEROI64 0I64
#endif

करने के लिए

#define ZEROI64 0LL

0I64 . के रूप में केवल विजुअल स्टूडियो द्वारा परिभाषित किया गया है। इसके अलावा किसी को CArray.cpp . में टेम्पलेट इंस्टेंटेशन को हटाना होगा लेकिन मुझे अभी भी एक The system cannot find the path specified. त्रुटि संदेश। इसी तरह मैं इसे सिगविन में संकलित करने में सक्षम नहीं था।

SQL C++ कनेक्टर विकल्प

मेरे पास आखिरी समस्या का कोई समाधान नहीं है लेकिन आप विकल्पों पर एक नज़र डालना चाहेंगे। आप SQLite डाउनलोड कर सकते हैं स्रोत से और इसे संकलित करें। स्रोत से स्थापना मार्गदर्शिका के अनुसार यह MinGW के साथ संगत है लेकिन यह केवल लाइटवेट . तो शेयरवेयर होना चाहिए SQLAPI++ . उनके "ऑर्डर" पेज के मुताबिक विंडोज़ के लिए परीक्षण संस्करण पूरी तरह कार्यात्मक है

दोनों को MySQL का समर्थन करना चाहिए:उदा। देखें यहां

tl;डॉ: MySQL और MariaDB कनेक्टर्स का उपयोग Windows केवल Visual Studio में . पर करें . यदि आप विजुअल स्टूडियो का उपयोग नहीं कर सकते हैं तो वैकल्पिक C++ SQL कनेक्टर जैसे SQLite और SQLAPI++ इसके बजाय।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. टेक्स्ट/ब्लॉब को एक ही टेबल में स्टोर करें या नहीं?

  2. एक MySQL डेटाबेस में सभी तालिकाओं को सूचीबद्ध करने के 4 तरीके

  3. रूबी/रेल/एमआरआई ऐप को JRuby . में पोर्ट करना

  4. लोड डेटा स्थानीय इनफाइल में वर्जित... PHP

  5. जब मैं हस्ताक्षरित बड़े int के लिए पूछता हूं तो डेल्फी (ज़ीओस) मुझे SQLite में व्यापक फ़ील्ड क्यों दे रहा है?