【问题标题】:MySQL and MariaDB library's in C++ using cmake, mingw使用 cmake、mingw 的 C++ 中的 MySQL 和 MariaDB 库
【发布时间】:2021-07-24 10:09:23
【问题描述】:

STARTIG WITH MYSLQ CONNECTOR - 这是我用来在 windows 上使用 CMAKE GUI 生成构建系统的 cmakelists.txt 文件(因为我实际上必须在 c++ 中为 windows 制作控制台应用程序)。

cmake_minimum_required(VERSION 3.16) # Or whatever version you use
set(CMAKE_CXX_STANDARD 17)
# THIS HAS TO COME BEFORE THE PROJECT LINE

# THIS HAS TO COME BEFORE THE PROJECT LINE
project(test VERSION 0.0.0 LANGUAGES C CXX)
project(main)
set(FULL_PATH_TO_MYSQL_CONNECTOR_CPP_DIR "C:\\connector")
include_directories(${FULL_PATH_TO_MYSQL_CONNECTOR_CPP_DIR}\\include)

link_directories(${FULL_PATH_TO_MYSQL_CONNECTOR_CPP_DIR}\\lib64\\v14)
add_executable(test main.cpp)
target_link_libraries(test C:/connector/lib64/vs14/mysqlcppconn.lib)

target_compile_features(test PRIVATE cxx_range_for)  
set(STDFS_LIB stdc++fs)

这是我要运行的代码 (main.cpp) -

#include <stdio.h>  
 #include <stdint.h>
#include <cstdint>
#include <sys/types.h>

#include <jdbc/cppconn/driver.h>
#include <jdbc/cppconn/exception.h>
#include <jdbc/cppconn/resultset.h>
#include <jdbc/cppconn/statement.h>
#include <jdbc/cppconn/prepared_statement.h>
//#include <mysql/mysql.h>


int main()
{
    try
        {
            sql::Driver *driver;
            sql::Connection *con;
            //sql::Statement *stmt;
            sql::ResultSet *res;
            sql::PreparedStatement *pstmt;

            /* Create a connection */
            driver = get_driver_instance();
        
    } catch (sql::SQLException &e)
        {
            ///nav implementēts vairāk info
            //cout << "# ERR: SQLException in " << __FILE__;
            //cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
            /* what() (derived from std::runtime_error) fetches error message */
            //cout << "# ERR: " << e.what();
            //cout << " (MySQL error code: " << e.getErrorCode();
            //cout << "# ERR: SQLException in " << endl;
        }
    return 0;
}

我正在使用 GNU make 编译它,但出现以下错误 -

C:\Users\FL\Desktop\TEST2>make
[ 50%] Building CXX object CMakeFiles/test.dir/main.cpp.obj
In file included from C:/PROGRA~1/MySQL/MYSQLC~1.0/include/jdbc/cppconn/resultse
t.h:36:0,
                 from C:\Users\FL\Desktop\TEST2\main.cpp:8:
C:/PROGRA~1/MySQL/MYSQLC~1.0/include/jdbc/cppconn/config.h:101:19: error: confli
cting declaration 'typedef long int int32_t'
 typedef __int32   int32_t;
                   ^~~~~~~
In file included from c:\mingw\lib\gcc\mingw32\6.3.0\include\stdint.h:9:0,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\cstdint:41,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\char_trait
s.h:420,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\string:40,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\stdexcept:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\array:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\tuple:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_map.h:
63,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\map:61,
                 from C:/PROGRA~1/MySQL/MYSQLC~1.0/include/jdbc/cppconn/connecti
on.h:36,
                 from C:/PROGRA~1/MySQL/MYSQLC~1.0/include/jdbc/cppconn/driver.h
:36,
                 from C:\Users\FL\Desktop\TEST2\main.cpp:6:
c:\mingw\include\stdint.h:62:15: note: previous declaration as 'typedef int int3
2_t'
 typedef int   int32_t;
               ^~~~~~~
In file included from C:/PROGRA~1/MySQL/MYSQLC~1.0/include/jdbc/cppconn/resultse
t.h:36:0,
                 from C:\Users\FL\Desktop\TEST2\main.cpp:8:
C:/PROGRA~1/MySQL/MYSQLC~1.0/include/jdbc/cppconn/config.h:105:26: error: confli
cting declaration 'typedef long unsigned int uint32_t'
 typedef unsigned __int32 uint32_t;
                          ^~~~~~~~
In file included from c:\mingw\lib\gcc\mingw32\6.3.0\include\stdint.h:9:0,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\cstdint:41,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\char_trait
s.h:420,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\string:40,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\stdexcept:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\array:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\tuple:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_map.h:
63,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\map:61,
                 from C:/PROGRA~1/MySQL/MYSQLC~1.0/include/jdbc/cppconn/connecti
on.h:36,
                 from C:/PROGRA~1/MySQL/MYSQLC~1.0/include/jdbc/cppconn/driver.h
:36,
                 from C:\Users\FL\Desktop\TEST2\main.cpp:6:
c:\mingw\include\stdint.h:63:19: note: previous declaration as 'typedef unsigned
 int uint32_t'
 typedef unsigned  uint32_t;
                   ^~~~~~~~
In file included from C:/PROGRA~1/MySQL/MYSQLC~1.0/include/jdbc/cppconn/statemen
t.h:36:0,
                 from C:\Users\FL\Desktop\TEST2\main.cpp:9:
C:/PROGRA~1/MySQL/MYSQLC~1.0/include/jdbc/cppconn/config.h:101:19: error: confli
cting declaration 'typedef long int int32_t'
 typedef __int32   int32_t;
                   ^~~~~~~
In file included from c:\mingw\lib\gcc\mingw32\6.3.0\include\stdint.h:9:0,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\cstdint:41,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\char_trait
s.h:420,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\string:40,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\stdexcept:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\array:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\tuple:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_map.h:
63,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\map:61,
                 from C:/PROGRA~1/MySQL/MYSQLC~1.0/include/jdbc/cppconn/connecti
on.h:36,
                 from C:/PROGRA~1/MySQL/MYSQLC~1.0/include/jdbc/cppconn/driver.h
:36,
                 from C:\Users\FL\Desktop\TEST2\main.cpp:6:
c:\mingw\include\stdint.h:62:15: note: previous declaration as 'typedef int int3
2_t'
 typedef int   int32_t;
               ^~~~~~~
In file included from C:/PROGRA~1/MySQL/MYSQLC~1.0/include/jdbc/cppconn/statemen
t.h:36:0,
                 from C:\Users\FL\Desktop\TEST2\main.cpp:9:
C:/PROGRA~1/MySQL/MYSQLC~1.0/include/jdbc/cppconn/config.h:105:26: error: confli
cting declaration 'typedef long unsigned int uint32_t'
 typedef unsigned __int32 uint32_t;
                          ^~~~~~~~
In file included from c:\mingw\lib\gcc\mingw32\6.3.0\include\stdint.h:9:0,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\cstdint:41,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\char_trait
s.h:420,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\string:40,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\stdexcept:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\array:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\tuple:39,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_map.h:
63,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\map:61,
                 from C:/PROGRA~1/MySQL/MYSQLC~1.0/include/jdbc/cppconn/connecti
on.h:36,
                 from C:/PROGRA~1/MySQL/MYSQLC~1.0/include/jdbc/cppconn/driver.h
:36,
                 from C:\Users\FL\Desktop\TEST2\main.cpp:6:
c:\mingw\include\stdint.h:63:19: note: previous declaration as 'typedef unsigned
 int uint32_t'
 typedef unsigned  uint32_t;
                   ^~~~~~~~
make[2]: *** [CMakeFiles/test.dir/main.cpp.obj] Error 1
make[1]: *** [CMakeFiles/test.dir/all] Error 2
make: *** [all] Error 2

这意味着 ether gcc 或 g++ 有问题,对吧?还是应该使用 mingw 安装目录中的 make 而不是其他目录中的 make?

C:\Users\FL>make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-pc-mingw32

更新:所有更改错误现在是:

[ 50%] Building CXX object CMakeFiles/test.dir/main.cpp.obj
[100%] Linking CXX executable test.exe
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x22):
ndefined reference to `check(std::__cxx11::basic_string<char, std::char_traits<
har>, std::allocator<char> > const&)'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x76):
ndefined reference to `check(std::map<std::__cxx11::basic_string<char, std::cha
_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::ch
r_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<ch
r, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<s
d::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > c
nst, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<ch
r> > > > > const&)'
collect2.exe: error: ld returned 1 exit status
make[2]: *** [CMakeFiles\test.dir\build.make:100: test.exe] Error 1
make[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/test.dir/all] Error 2
make: *** [Makefile:90: all] Error 2```

所以可能 MINGW 不适用于预编译的连接器,但只能使用相同的编译器编译,所以:

所以我首先要做的是从https://dev.mysql.com/downloads/connector/cpp/ 下载为 windows 预编译的 mysql 连接器 8.0 安装在 C:\connector

然后我想也许它根本不适用于 MINGW“编译器”所以我找到了这篇文章 https://forums.mysql.com/read.php?117,426293,426927

我在https://dev.mysql.com/doc/connector-cpp/8.0/en/connector-cpp-installation-source-distribution.html下载了它的源代码

在使用 cmake 编译时,我遇到了这个错误,没有找到使用“make”命令所需的 makefile -

The C compiler identification is GNU 9.2.0
The CXX compiler identification is GNU 9.2.0
Detecting C compiler ABI info
Detecting C compiler ABI info - done
Check for working C compiler: C:/MinGW/bin/gcc.exe - skipped
Detecting C compile features
Detecting C compile features - done
Detecting CXX compiler ABI info
Detecting CXX compiler ABI info - done
Check for working CXX compiler: C:/MinGW/bin/g++.exe - skipped
Detecting CXX compile features
Detecting CXX compile features - done
BIG_ENDIAN: 0
Building version 8.0.24
Building on system: Windows-6.1.7601 (AMD64)
Using cmake generator: MinGW Makefiles
Using toolset: 
Building 64bit code
Building shared connector library
Configuring CDK as part of MySQL_CONCPP project
Looking for SSL library.
CMake Error at cdk/cmake/DepFindSSL.cmake:79 (message):
  Cannot find appropriate system libraries for SSL.  Make sure you've
  specified a supported SSL version.  Consult the documentation for WITH_SSL
  alternatives
Call Stack (most recent call first):
  cdk/cmake/DepFindSSL.cmake:354 (main)
  cdk/cmake/dependency.cmake:42 (include)
  cdk/CMakeLists.txt:96 (find_dependency)


Setting up Protobuf.
==== Configuring Protobuf build using cmake generator: MinGW Makefiles   -DCMAKE_SYSTEM_NAME=Windows;-DCMAKE_SYSTEM_VERSION=6.1.7601
CMake Deprecation Warning at CMakeLists.txt:44 (cmake_minimum_required):

  Compatibility with CMake < 2.8.12 will be removed from a future version of

  CMake.



  Update the VERSION argument <min> value or use a ...<max> suffix to tell

  CMake that the project does not need compatibility with older versions.





-- The C compiler identification is GNU 9.2.0

-- The CXX compiler identification is GNU 9.2.0

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Check for working C compiler: C:/MinGW/bin/gcc.exe - skipped

-- Detecting C compile features

-- Detecting C compile features - done

-- Detecting CXX compiler ABI info

-- Detecting CXX compiler ABI info - done

-- Check for working CXX compiler: C:/MinGW/bin/g++.exe - skipped

-- Detecting CXX compile features

-- Detecting CXX compile features - done

-- BIG_ENDIAN: 0

-- Looking for pthread.h

-- Looking for pthread.h - found

-- Performing Test CMAKE_HAVE_LIBC_PTHREAD

-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success

-- Found Threads: TRUE  

Using pthreads for protobuf code


-- Configuring done

-- Generating done

-- Build files have been written to: C:/Users/FL/Desktop/mysql-connector-cpp/cdk/protobuf

==== Protobuf build configured.
Processor Count: 1
Setting up RapidJSON.
Skipping second declaration of config option: THROW_AS_ASSERT (found in: C:/Users/FL/Desktop/mysql-connector-cpp/cdk/CMakeLists.txt)
Performing Test HAVE_STATIC_ASSERT
Performing Test HAVE_STATIC_ASSERT - Success
Performing Test HAVE_IS_SAME
Performing Test HAVE_IS_SAME - Failed
CMake Deprecation Warning at cdk/extra/zlib/CMakeLists.txt:24 (cmake_minimum_required):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


CMake Deprecation Warning at cdk/extra/zlib/CMakeLists.txt:37 (CMAKE_POLICY):
  The OLD behavior for policy CMP0075 will be removed from a future version
  of CMake.

  The cmake-policies(7) manual explains that the OLD behaviors of all
  policies are deprecated and that a policy should be set to OLD only under
  specific short-term circumstances.  Projects should be ported to the NEW
  behavior and not rely on setting a policy to OLD.


Looking for sys/types.h
Looking for sys/types.h - found
Looking for stdint.h
Looking for stdint.h - found
Looking for stddef.h
Looking for stddef.h - found
Check size of off64_t
Check size of off64_t - done
Looking for fseeko
Looking for fseeko - found
Looking for unistd.h
Looking for unistd.h - found
CMake Deprecation Warning at cdk/extra/zstd/CMakeLists.txt:11 (CMAKE_MINIMUM_REQUIRED):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


ZSTD_LEGACY_SUPPORT not defined!
Performing Test HAVE_SHARED_PTR
Performing Test HAVE_SHARED_PTR - Success
Performing Test HAVE_SYSTEM_ERROR
Performing Test HAVE_SYSTEM_ERROR - Success
Check size of wchar_t
Check size of wchar_t - done
Looking for sys/endian.h
Looking for sys/endian.h - not found
Looking for sys/byteorder.h
Looking for sys/byteorder.h - not found
CMake Deprecation Warning at cdk/core/CMakeLists.txt:30 (cmake_minimum_required):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


Wrote configuration header: C:/Users/FL/Desktop/mysql-connector-cpp/cdk/include/mysql/cdk/config.h
Preparing to merge SHARED library: connector (xapi;devapi)
Connector library name: mysqlcppconn8-2
Building version 8.0.24
Generating INFO_SRC
Generating INFO_BIN
Install location: C:/Users/FL/MySQL/MySQL Connector C++ 
Connector libraries will be installed at: lib64

Project configuration options:

: BUILD_STATIC: OFF
Build static version of connector library

: WITH_SSL: system
Either 'system' to use system-wide OpenSSL library, or custom OpenSSL location. (default : system)

: WITH_JDBC: OFF
Whether to build a variant of connector library which implements legacy JDBC API

Configuring incomplete, errors occurred!
See also "C:/Users/FL/Desktop/mysql-connector-cpp/CMakeFiles/CMakeOutput.log".
See also "C:/Users/FL/Desktop/mysql-connector-cpp/CMakeFiles/CMakeError.log".

** 有点晚了 ****

OKAAAAAAY 所以我正在尝试使用 MINGW 和以下 cmakelists.txt 配置来编译 MARIADB https://mariadb.com/docs/clients/connector-cpp/

cmake_minimum_required(VERSION 3.16) # Or whatever version you use
set(CMAKE_CXX_STANDARD 17)
# THIS HAS TO COME BEFORE THE PROJECT LINE
project(test VERSION 0.0.0 LANGUAGES C CXX)
project(main)
set(FULL_PATH_TO_MYSQL_CONNECTOR_CPP_DIR "C:\\mariaconnector")
include_directories(${FULL_PATH_TO_MYSQL_CONNECTOR_CPP_DIR}\\include)
add_executable(test main.cpp)
target_compile_features(test PRIVATE cxx_range_for)  
set(STDFS_LIB stdc++fs)

我的代码是:

#include <stdio.h>  
#include <stdint.h>
#include <cstdint>
#include <sys/types.h>
#include <iostream>
#include <mariadb/conncpp.hpp>

//#include <mysql/mysql.h>
using std::uint32_t;

// Function to print Contacts
void printContacts(std::shared_ptr<sql::Statement> &stmnt)
{
   try
   {
      // Execute SELECT Statement
      std::unique_ptr<sql::ResultSet> res(
            stmnt->executeQuery("SELECT first_name, last_name, email FROM test.contacts")
         );

      // Loop over Result-set
      while (res->next())
      {
         // Retrieve Values and Print Contacts
         std::cout << "- "
            << res->getString("first_name")
            << " "
            << res->getString("last_name")
            << " <"
            << res->getString("email")
            << ">"
            << std::endl;
      }
   }

   // Catch Exception
   catch (sql::SQLException& e)
   {
      std::cerr << "Error printing contacts: "
         << e.what() << std::endl;
   }
}

// Main Process
int main(int argc, char **argv)
{
   try
   {
      // Instantiate Driver
      sql::Driver* driver = sql::mariadb::get_driver_instance();

      // Configure Connection
      // The URL or TCP connection string format is
      // ``jdbc:mariadb://host:port/database``.
      sql::SQLString url("jdbc:mariadb://192.0.2.1:3306/test");

      // Use a properties map for the user name and password
      sql::Properties properties({
            {"user", "db_user"},
            {"password", "db_user_password"}
         });

      // Establish Connection
      // Use a smart pointer for extra safety
      std::unique_ptr<sql::Connection> conn(driver->connect(url, properties));

      // Create a Statement
      // Use a smart pointer for extra safety
      std::shared_ptr<sql::Statement> stmnt(conn->createStatement());

      printContacts(stmnt);

      // Close Connection
      conn->close();
   }

   // Catch Exceptions
   catch (sql::SQLException &e)
   {
      std::cerr << "Error Connecting to MariaDB Platform: "
         << e.what() << std::endl;

      // Exit (Failed)
      return 1;
   }

   // Exit (Success)
   return 0;
}

我收到此错误-

C:\Users\FL\Desktop\testMARIA>make
[ 50%] Building CXX object CMakeFiles/test.dir/main.cpp.obj
[100%] Linking CXX executable test.exe
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0xd4):
ndefined reference to `__imp__ZN3sql9SQLStringC1EPKc'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0xff):
ndefined reference to `__imp__ZN3sql9SQLStringD1Ev'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x16a):
undefined reference to `__imp__ZN3sql9SQLStringC1EPKc'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x190):
undefined reference to `__imp__ZN3sqllsERSoRKNS_9SQLStringE'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x1d4):
undefined reference to `__imp__ZN3sql9SQLStringC1EPKc'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x1fa):
undefined reference to `__imp__ZN3sqllsERSoRKNS_9SQLStringE'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x23e):
undefined reference to `__imp__ZN3sql9SQLStringC1EPKc'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x264):
undefined reference to `__imp__ZN3sqllsERSoRKNS_9SQLStringE'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x292):
undefined reference to `__imp__ZN3sql9SQLStringD1Ev'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x2a2):
undefined reference to `__imp__ZN3sql9SQLStringD1Ev'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x2b2):
undefined reference to `__imp__ZN3sql9SQLStringD1Ev'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x2c2):
undefined reference to `__imp__ZN3sql9SQLStringD1Ev'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x2d2):
undefined reference to `__imp__ZN3sql9SQLStringD1Ev'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x2e2):
more undefined references to `__imp__ZN3sql9SQLStringD1Ev' follow
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x470):
undefined reference to `__imp__ZN3sql7mariadb19get_driver_instanceEv'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x48a):
undefined reference to `__imp__ZN3sql9SQLStringC1EPKc'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x5e3):
undefined reference to `__imp__ZN3sql9SQLStringD1Ev'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x67f):
undefined reference to `__imp__ZN3sql9SQLStringD1Ev'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text$_ZNSt4p
irIKN3sql9SQLStringES1_ED1Ev[_ZNSt4pairIKN3sql9SQLStringES1_ED1Ev]+0x1a): undef
ned reference to `__imp__ZN3sql9SQLStringD1Ev'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text$_ZNSt4p
irIKN3sql9SQLStringES1_ED1Ev[_ZNSt4pairIKN3sql9SQLStringES1_ED1Ev]+0x2a): undef
ned reference to `__imp__ZN3sql9SQLStringD1Ev'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text$_ZNSt4p
irIKN3sql9SQLStringES1_EC1IRA5_KcRA8_S5_Lb1EEEOT_OT0_[_ZNSt4pairIKN3sql9SQLStri
gES1_EC1IRA5_KcRA8_S5_Lb1EEEOT_OT0_]+0x33): undefined reference to `__imp__ZN3s
l9SQLStringC1EPKc'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text$_ZNSt4p
irIKN3sql9SQLStringES1_EC1IRA5_KcRA8_S5_Lb1EEEOT_OT0_[_ZNSt4pairIKN3sql9SQLStri
gES1_EC1IRA5_KcRA8_S5_Lb1EEEOT_OT0_]+0x56): undefined reference to `__imp__ZN3s
l9SQLStringC1EPKc'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text$_ZNSt4p
irIKN3sql9SQLStringES1_EC1IRA5_KcRA8_S5_Lb1EEEOT_OT0_[_ZNSt4pairIKN3sql9SQLStri
gES1_EC1IRA5_KcRA8_S5_Lb1EEEOT_OT0_]+0x6b): undefined reference to `__imp__ZN3s
l9SQLStringD1Ev'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text$_ZNSt4p
irIKN3sql9SQLStringES1_EC1IRA9_KcRA17_S5_Lb1EEEOT_OT0_[_ZNSt4pairIKN3sql9SQLStr
ngES1_EC1IRA9_KcRA17_S5_Lb1EEEOT_OT0_]+0x33): undefined reference to `__imp__ZN
sql9SQLStringC1EPKc'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text$_ZNSt4p
irIKN3sql9SQLStringES1_EC1IRA9_KcRA17_S5_Lb1EEEOT_OT0_[_ZNSt4pairIKN3sql9SQLStr
ngES1_EC1IRA9_KcRA17_S5_Lb1EEEOT_OT0_]+0x56): undefined reference to `__imp__ZN
sql9SQLStringC1EPKc'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text$_ZNSt4p
irIKN3sql9SQLStringES1_EC1IRA9_KcRA17_S5_Lb1EEEOT_OT0_[_ZNSt4pairIKN3sql9SQLStr
ngES1_EC1IRA9_KcRA17_S5_Lb1EEEOT_OT0_]+0x6b): undefined reference to `__imp__ZN
sql9SQLStringD1Ev'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text$_ZNKSt4
essIN3sql9SQLStringEEclERKS1_S4_[_ZNKSt4lessIN3sql9SQLStringEEclERKS1_S4_]+0x22
: undefined reference to `__imp__ZNK3sql9SQLStringltERKS0_'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text$_ZNSt4p
irIKN3sql9SQLStringES1_EC1ERKS3_[_ZNSt4pairIKN3sql9SQLStringES1_EC1ERKS3_]+0x24
: undefined reference to `__imp__ZN3sql9SQLStringC1ERKS0_'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text$_ZNSt4p
irIKN3sql9SQLStringES1_EC1ERKS3_[_ZNSt4pairIKN3sql9SQLStringES1_EC1ERKS3_]+0x40
: undefined reference to `__imp__ZN3sql9SQLStringC1ERKS0_'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32
bin/ld.exe: CMakeFiles\test.dir/objects.a(main.cpp.obj):main.cpp:(.text$_ZNSt4p
irIKN3sql9SQLStringES1_EC1ERKS3_[_ZNSt4pairIKN3sql9SQLStringES1_EC1ERKS3_]+0x55
: undefined reference to `__imp__ZN3sql9SQLStringD1Ev'
collect2.exe: error: ld returned 1 exit status
make[2]: *** [CMakeFiles\test.dir\build.make:99: test.exe] Error 1
make[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/test.dir/all] Error 2
make: *** [Makefile:90: all] Error 2

:>

【问题讨论】:

  • 你能删除#include &lt;stdint.h&gt;#include &lt;cstdint&gt;吗?

标签: c++ mysql cmake mariadb mingw


【解决方案1】:

连接器 MySQL 和 MariaDB(share the same heritage只能在 Windows 上与 Visual Studio 一起编译和使用。你会在 StackOverflow 上找到很多关于它的先前问题。它们的问题是它们定义了很多已经在标准库中定义的结构,然后也链接到标准库。

我建议您切换到 Visual Studio 或 Linux 系统。如果您必须在 Windows 下使用 GCC,请寻找另一个连接器。这些问题不会轻易解决。如果是这样,解决方案不太可能是可移植的,并且可能不适用于两个连接器的未来版本。你可以看看 alternatives SQLiteSQLAPI++


第一个问题:定宽整数

您提到的第一个问题实际上与头文件中定义的fixed-width integer types 和32 位操作系统有关。有charshortintlonglong long 等传统整数类型,还有前面提到的固定宽度整数。

MySql 连接器在 config.h 中定义了 int32_t 数据类型,标准 C++ 库也定义了它们:MySql 使用编译器数据类型 __int32 定义了 int32_t

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 位(参见 here)。这意味着实际上对于 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

解决方案

根据上面给出的头文件的结构,有几个解决方案。有些可能更可行,而另一些则不那么可行。

  • 很明显,您可以cstdintstdint.h 中不包含任何类型定义,并使用 MySql 定义。这实际上是非常有限的,因为迟早可能会有另一个标准库头文件包含它,并且可能会导致您根本不使用标准库,这可能是非常有限的。

  • 您可以完全放弃正在使用的 32 位构建工具链,切换到 **64 位编译器并编译为 64 位。在这种情况下,这不应该发生,因为 MySql 中的标头 config.h 仅包含在 32 位系统中,如上所述!如果没有充分的理由认为您的项目应该是 32 位的,那我实际上会这样做。谈论您的编译器:您似乎使用的是 2016 年发布的 GCC 6.3.0,实际上 does not fully support the C++17 language standard 您告诉它在您的 CMake 文件中使用 CMAKE_CXX_STANDARD 17 进行编译。如果您想广泛使用 C++17 功能,您可能需要使用另一个更新的编译器。否则 C++14 也不错。

  • 您可以使用 Visual Studio 2010(版本 1600或更高版本进行编译,因为在这种情况下,标头将自动包含标准中的定义,而不是定义自己的。

  • 您可以在代码顶部(或在您用于项目的 IDE 中)定义预处理器标志 #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
    

    这将为您将来编写的所有包含此标头的程序停用相应的定义。


第二个问题:链接到用 Visual Studio 编译的库

您收到的第二条错误消息实际上与链接库有关。在 Windows 上,使用不同编译器编译的库通常不兼容。这意味着使用 GCC 编译的程序不能包含使用 Visual Studio 编译的库。 在您的情况下,DLL 是使用 Visual Studio 编译的,因此链接到您的 GCC 程序失败。

正如here 也提到的,您可以通过cmake -G "MinGW Makefiles" 强制 CMake 使用 MinGW 而不是 Visual Studio,但我已经尝试过了,它既不适用于 MariaDB,也不适用于 MySQL。

在 MySQL 中使用 MSYS2 在 MariaDB 上遵循 offical guide 然后使用时,我得到一个与 OpenSSL 相关的神秘错误

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 仅由 Visual Studio 定义。此外,必须删除CArray.cpp 中的模板实例化,但我仍然会收到The system cannot find the path specified. 错误消息。同样,我无法让它在 Cygwin 中编译。


SQL C++ 连接器替代品

我没有最后一个问题的解决方案,但您可能想看看替代方案。您可以从源代码下载SQLite 并编译它。根据installation guide from source,它与MinGW 兼容,但只有lightweight。共享软件SQLAPI++ 也应该如此。根据their "Order" page,Windows 的试用版功能齐全

您只能将试用版用于评估目的。评价 版本与注册版本没有限制或功能差异 版本。但是,评估版显示注册消息 每次应用程序执行其第一个数据库连接时 (Windows 版本)。

注册后您将:

  • 接收库的非试用版,包括其完整源代码
  • 继续获得终身免费电子邮件支持
  • 获得一年的免费错误修复和新版本升级

两者都应该支持 MySql:例如见here


tl;dr:仅在 Visual Studio 中的 Windows 上使用 MySQL 和 MariaDB 连接器。如果您不能使用 Visual Studio,请查看 替代 C++ SQL 连接器,例如 SQLiteSQLAPI++

【讨论】:

  • 好的,但是 Google 说 - “C++17 功能自 GCC 5 起可用。此模式是 GCC 11 中的默认模式;可以使用 -std=c++17 命令显式选择它-line 标志,或 -std=gnu++17 以启用 GNU 扩展。”
  • 我通过从 nuwen.net/mingw.html#install 下载 mingw 升级了我的 GCC 版本,它与 GCC 9.2.0 一起提供,现在如果我删除“target_link_libraries(test mysqlcppconn)”,我会收到此错误,-paste.ubuntu.com/p/mTGH8cdbmj 原因否则我得到“找不到-lmysqlcppconn。”
  • @RonaldsMazītis 一些 C++17 功能,但并非全部,如我发送给您的列表中所示。最终的 C++17 标准在 December 2017 发布,而 GCC 5 were released between 2015 and 2017GCC 6.3 in December 2016 的不同版本
  • 不要删除target_link_libraries,它将把你的代码和MySql库代码结合起来。你能检查一下你的 MySql 库在哪里吗?您将C:\\Program Files\\MySQL\\MySQL Connector C++ 8.0 放入您的Makefile 中。这真的是MySql所在的正确路径吗?如果是,那里有什么文件?只有标题还是 .lib.dll 文件?
  • 从这里的某个地方下载它 - dev.mysql.com/doc/connector-j/8.0/en 这是默认安装位置。
【解决方案2】:

这就是我在 MSYS2 shell (https://www.msys2.org/) 下使用 MinGW-w64(我使用来自 http://winlibs.com/ 的编译器)构建 MariaDB 客户端库的方式:

wget https://downloads.mariadb.org/interstitial/connector-c-3.1.11/mariadb-connector-c-3.1.11-src.tar.gz
tar xfz mariadb-connector-c-3.1.11-src.tar.gz
cd mariadb-connector-c-3.1.11-src

# fix cmake/ConnectorName.cmake (version >= 3.1.11)
patch -ulbf cmake/ConnectorName.cmake << EOF
@@ -24,3 +24,3 @@
     SET(MACHINE_NAME "32")
-  END()
+  ENDIF()
 ENDIF()
EOF

# set install location
INSTALLPREFIX=D:/Prog/mariadb-connector

# configure
cmake.exe -GNinja -DCMAKE_INSTALL_PREFIX:PATH=$INSTALLPREFIX -DCMAKE_BUILD_TYPE:STRING=Release -DWITH_CURL:BOOL=OFF -DWITH_DYNCOL:BOOL=ON -DWITH_EXTERNAL_ZLIB:BOOL=ON -DWITH_MYSQLCOMPAT:BOOL=ON -DWITH_SSL:STRING=GNUTLS -DWITH_UNIT_TESTS:BOOL=OFF -DCMAKE_SHARED_LINKER_FLAGS=-Wl,--enable-stdcall-fixup -S. -Bbuild_win

# build and install
ninja -Cbuild_win install/strip

# move library files out of mariadb folder
mv -f $INSTALLPREFIX/lib/mariadb/*.dll $INSTALLPREFIX/bin/ &&
mv -f $INSTALLPREFIX/lib/mariadb/liblibmariadb.dll.a $INSTALLPREFIX/lib/libmariadb.dll.a &&
mv -f $INSTALLPREFIX/lib/mariadb/*.a $INSTALLPREFIX/lib/

# make copies for MySQL compatibility
cp -f $INSTALLPREFIX/lib/libmariadb.dll.a $INSTALLPREFIX/lib/libmariadbclient.dll.a &&
cp -f $INSTALLPREFIX/lib/libmariadbclient.dll.a $INSTALLPREFIX/lib/libmysqlclient.dll.a &&
cp -f $INSTALLPREFIX/lib/libmariadbclient.dll.a $INSTALLPREFIX/lib/libmysqlclient_r.dll.a &&
cp -f $INSTALLPREFIX/lib/libmariadbclient.a $INSTALLPREFIX/lib/libmysqlclient.a &&
cp -f $INSTALLPREFIX/lib/libmariadbclient.a $INSTALLPREFIX/lib/libmysqlclient_r.a &&
cp -f $INSTALLPREFIX/lib/libmariadbclient.a $INSTALLPREFIX/lib/libmariadb.a &&
cp -f $INSTALLPREFIX/bin/mariadb_config.exe $INSTALLPREFIX/bin/mysql_config.exe

当然,在构建之前,您需要已经安装了先决条件(zlib 和 gnutls)。

如果您出于某种原因不想使用 Ninja,可以将 -GNinja 替换为 -G"MSYS Makefiles" 并将 ninja -Cbuild_win install/strip 替换为 make -Cbuild_win install-strip

然后为了构建依赖于 MySQL 客户端的库,我将 -I$INSTALLPREFIX/include/mariadb 添加到编译器标志中。

【讨论】:

    【解决方案3】:

    这不是您问题的答案,但评论太长了......

    MariaDB Connector/C 的维护者(以及 MySQL Connector/C 的前维护者)的几句话:

    MinGW 从来都不是受支持的平台/环境,但我们尽最大努力支持它(就像许多其他官方不支持的平台一样)。主要问题是(或仍然是)MinGW 始终落后于最新/稳定的 Windows 版本。我们尝试添加一个自定义包含文件,其中可以添加一些东西,例如缺少定义,但在我们决定使用 Schannel 支持 OpenSSL 在 Windows 平台上进行安全 (tls) 连接后,它就不再起作用了。

    如果有人有好的解决方案,例如通过添加可选的包含文件,我可以合并您的拉取请求。使用 MinGW 条件定义修改 C 代码不是一种选择。

    您的问题被标记为 Connector/C++ - 但是来自 MariaDB 和 MySQL 的 C++ 连接器都在使用 Connector/C。

    关于上一个答案: 使用 GnuTLS 构建是可行的,但是有一些限制。例如,除非您使用安全 (tls) 连接,否则像 caching_sha2_password 这样的 MySQL 身份验证插件将不起作用。

    【讨论】:

      猜你喜欢
      • 2013-12-01
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多