繁体   English   中英

使用 mysql-c++-connector 8 将 c++ 连接到 mysql

[英]Connecting c++ to mysql using mysql-c++-connector 8

我想使用 mysql-c++-connector8 (xdevapi) 连接到 mysql 8,我使用 .so 文件进行链接,但我的main.cpp文件出现错误

#include <iostream>
#include <mysqlx/xdevapi.h>

using namespace ::mysqlx;
using std::cout;
using std::cin;
using std::endl;

int main(){

 Session sess("localhost",3306,"root","mypass");
 Schema db = sess.getSchema("university");

 Collection myColl = db.getCollection("student");
 DocResult myDocs = myColl.find("name like :param").execute();

 cout<<myDocs.fetchOne();
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(1)
set(CMAKE_CXX_STANDARD 17)

include_directories(~/mysql-connector-c++/include)
link_directories(~/mysql-connector-c++/lib64)

set(PROJECT_LINK_LIBS libmysqlcppconn8.so)
add_executable(myExe main.cpp)
target_link_libraries(myExe ${PROJECT_LINK_LIBS})

错误:

[ 50%] Linking CXX executable myExe
/usr/bin/ld: CMakeFiles/myExe.dir/main.cpp.o: in function `mysqlx::string::string(char const*)':
/home/amir/mysql-connector-c++/include/mysqlx/devapi/common.h:100: undefined reference to `mysqlx::string::Impl::from_utf8(mysqlx::string&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: CMakeFiles/myExe.dir/main.cpp.o: in function `mysqlx::string::string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/home/amir/mysql-connector-c++/include/mysqlx/devapi/common.h:105: undefined reference to `mysqlx::string::Impl::from_utf8(mysqlx::string&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: CMakeFiles/myExe.dir/main.cpp.o: in function `mysqlx::string::operator std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >() const':
/home/amir/mysql-connector-c++/include/mysqlx/devapi/common.h:115: undefined reference to `mysqlx::string::Impl::to_utf8[abi:cxx11](mysqlx::string const&)'
/usr/bin/ld: CMakeFiles/myExe.dir/main.cpp.o: in function `void mysqlx::internal::Settings_detail<mysqlx::internal::Settings_traits>::set<true, mysqlx::SessionOption, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, mysqlx::SessionOption, unsigned int&, mysqlx::SessionOption, mysqlx::string const&>(mysqlx::SessionOption, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, mysqlx::SessionOption&&, unsigned int&, mysqlx::SessionOption&&, mysqlx::string const&)':
/home/amir/mysql-connector-c++/include/mysqlx/devapi/detail/settings.h:67: undefined reference to `mysqlx::internal::Settings_detail<mysqlx::internal::Settings_traits>::do_set(std::__cxx11::list<std::pair<int, mysqlx::common::Value>, std::allocator<std::pair<int, mysqlx::common::Value> > >&&)'
/usr/bin/ld: CMakeFiles/myExe.dir/main.cpp.o: in function `void mysqlx::internal::Settings_detail<mysqlx::internal::Settings_traits>::set<true, mysqlx::SessionOption, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(mysqlx::SessionOption, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&)':
/home/amir/mysql-connector-c++/include/mysqlx/devapi/detail/settings.h:67: undefined reference to `mysqlx::internal::Settings_detail<mysqlx::internal::Settings_traits>::do_set(std::__cxx11::list<std::pair<int, mysqlx::common::Value>, std::allocator<std::pair<int, mysqlx::common::Value> > >&&)'
/usr/bin/ld: CMakeFiles/myExe.dir/main.cpp.o: in function `void mysqlx::internal::Settings_detail<mysqlx::internal::Settings_traits>::set<true, mysqlx::SessionOption, mysqlx::string const&>(mysqlx::SessionOption, mysqlx::string const&)':
/home/amir/mysql-connector-c++/include/mysqlx/devapi/detail/settings.h:67: undefined reference to `mysqlx::internal::Settings_detail<mysqlx::internal::Settings_traits>::do_set(std::__cxx11::list<std::pair<int, mysqlx::common::Value>, std::allocator<std::pair<int, mysqlx::common::Value> > >&&)'
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/myExe.dir/build.make:95: myExe] Error 1
make[2]: *** [CMakeFiles/Makefile2:68: CMakeFiles/myExe.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:80: CMakeFiles/myExe.dir/rule] Error 2
make: *** [Makefile:118: myExe] Error 2

我不想使用旧式连接器,因为不推荐使用

TL; 博士; 您需要通过将_GLIBCXX_USE_CXX11_ABI设置为0来使用旧的 GCC ABI。 这可以通过将以下内容添加到CMakeLists.txt来使用cmake完成:

add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)

问题来自 MySQL 连接器的“Linux - 通用”,它可能是在没有GCC的新CXX11 ABI (在 gcc 5.1 中引入)的情况下构建的。

由于你的编译器是最新的,默认是使用新的 ABI,所以当你包含<mysqlx/xdevapi.h> ,你创建如下声明:

mysqlx::string::Impl::from_utf8(
    mysqlx::string&, 
    std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)

...使用新的 ABI(请参阅__cxx11命名空间)。

但是由于连接器是用旧的 ABI 构建的, libmysqlcppconn8.so包含匹配这种声明的函数的符号:

mysqlx::string::Impl::from_utf8(
    mysqlx::string&, 
    std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)

您可以通过运行readelf -Ws libmysqlcppconn8.so来检查这一点,对于我得到的“Linux - 通用”版本(使用grep from_utf81

1428: 00000000000a0a86 193 FUNC  GLOBAL DEFAULT   12 _ZN6mysqlx6string4Impl9from_utf8ERS0_RKSs
9437: 00000000000a0a86 193 FUNC  GLOBAL DEFAULT   12 _ZN6mysqlx6string4Impl9from_utf8ERS0_RKSs

但是对于 Ubuntu 18.10 版本,我得到:

  725: 00000000000a23e0 183 FUNC GLOBAL DEFAULT   12 _ZN6mysqlx6string4Impl9from_utf8ERS0_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
10141: 00000000000a23e0 183 FUNC GLOBAL DEFAULT   12 _ZN6mysqlx6string4Impl9from_utf8ERS0_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

最简单的解决方法是告诉编译器使用旧的 ABI,以便符号匹配。 这可以通过在编译时将_GLIBCXX_USE_CXX11_ABI宏设置为 0 来完成:

g++ -D_GLIBCXX_USE_CXX11_ABI=0 main.cpp

...或通过将以下内容添加到CMakeLists.txt

add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)

如果你使用多个外部库,你必须小心那些也使用旧 ABI 的,否则你可能会面临相反的问题,即用新 ABI 构建的库不能直接用于用旧 ABI 构建程序.


1 “Linux - 通用”版本包含对 CXX11 ABI 的引用,所以我真的不知道这里发生了什么。 看起来库的某些部分已经使用新的 ABI 编译。

您可能需要下载当前操作系统的特定版本而不是 generic-linux 版本。

例如rhel8 x86_64平台,需要下载mysql-connector-c++-8.0.23-1.el8.x86_64.rpmmysql-connector-c++-devel-8.0.23-1.el8.x86_64.rpm ( https://dev.mysql.com/downloads/connector/cpp/ )

然后将其解压缩到同一文件夹中。 (注:如果您有Windows系统,请把它解压缩在linux因为有它的一些软链接),然后只是用它没有老CXX11ABI(不需要定义_GLIBCXX_USE_CXX11_ABI = 0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM