解决链接器错误 MySQL 连接器/C++

Posted

技术标签:

【中文标题】解决链接器错误 MySQL 连接器/C++【英文标题】:Resolving Linker error MySQL Connector/C++ 【发布时间】:2020-03-28 16:17:26 【问题描述】:

我希望能够从我的 c++ 程序连接到本地 mysql 实例,但以下最小文件 testfile.cpp 无法编译并返回未定义的引用:

#include <mysqlx/xdevapi.h>    
using namespace ::mysqlx;

int main()

    printf("Hello world!\n");
    return 0;

我怀疑没有使用正确的编译标志。当我使用命令时

c++ -o test1 -std=c++11 -lmysqlcppconn8 -I /usr/include/mysql-cppconn-8/ testfile.cpp 

我收到以下错误消息(翻译成英文):

/tmp/cc02ZbBr.o: In the function "mysqlx::abi2::r0::string::traits<char>::to_str[abi:cxx11](mysqlx::abi2::r0::string const&)":
testfile.cpp:(.text._ZN6mysqlx4abi22r06string6traitsIcE6to_strB5cxx11ERKS2_[_ZN6mysqlx4abi22r06string6traitsIcE6to_strB5cxx11ERKS2_]+0x2e): undefined reference to "mysqlx::abi2::r0::string::Impl::to_utf8[abi:cxx11](mysqlx::abi2::r0::string const&)"
/tmp/cc02ZbBr.o: In the function "mysqlx::abi2::r0::DbDoc::DbDoc()":
testfile.cpp:(.text._ZN6mysqlx4abi22r05DbDocC2Ev[_ZN6mysqlx4abi22r05DbDocC5Ev]+0x1b): undefined reference to "vtable for mysqlx::abi2::r0::DbDoc"
/tmp/cc02ZbBr.o: In the function "mysqlx::abi2::r0::DbDoc::~DbDoc()":
testfile.cpp:(.text._ZN6mysqlx4abi22r05DbDocD2Ev[_ZN6mysqlx4abi22r05DbDocD5Ev]+0xf): undefined reference to "vtable for mysqlx::abi2::r0::DbDoc"
/tmp/cc02ZbBr.o: In the function "mysqlx::abi2::r0::Value::print(std::ostream&) const":
testfile.cpp:(.text._ZNK6mysqlx4abi22r05Value5printERSo[_ZNK6mysqlx4abi22r05Value5printERSo]+0x88): undefined reference to "mysqlx::abi2::r0::common::Value::print(std::ostream&) const"
/tmp/cc02ZbBr.o:(.data.rel.ro._ZTCN6mysqlx4abi22r05ValueE0_NS1_6common5ValueE[_ZTVN6mysqlx4abi22r05ValueE]+0x18): undefined reference to "typeinfo for mysqlx::abi2::r0::common::Value"
/tmp/cc02ZbBr.o:(.data.rel.ro._ZTCN6mysqlx4abi22r05ValueE0_NS1_6common5ValueE[_ZTVN6mysqlx4abi22r05ValueE]+0x20): undefined reference to "mysqlx::abi2::r0::common::Value::print(std::ostream&) const"
/tmp/cc02ZbBr.o:(.data.rel.ro._ZTIN6mysqlx4abi22r05ValueE[_ZTIN6mysqlx4abi22r05ValueE]+0x28): undefined reference to "typeinfo for mysqlx::abi2::r0::common::Value"
collect2: error: ld returned 1 exit status

此文件的标头来自 MySQL Connector/C++ 的 Github 上的示例代码。

This question 上的 SO 似乎相关,但语法/目录可能已过时。无论如何,我不知道如何根据我的情况和图书馆的位置调整那里给出的答案。因此,我在这里寻求帮助。

更多信息: 我正在运行 Linux Ubuntu 18.04、MySQL 版本 8.0.19 并在 /usr/lib/x86_64-linux-gnu/ 中有以下文件

libmysqlcppconn.so  
libmysqlcppconn.so.7.8.0.19  
libmysqlcppconn.so.7  

但我不知道如何引用它们。 在/usr/include/mysql-cppconn-8/ 我有目录jdbc/mysql/mysqlx/。 我使用 apt 包管理器安装了以下二进制包:libmysqlcppconn-devlibmysqlcppconn7libmysqlcppconn8-1libmysqlcppconn8-2(这可能有点矫枉过正,但根据installation guide 必须安装其中的一些库) .

which mysql 返回/usr/bin/mysql

【问题讨论】:

【参考方案1】:

当您编译源文件并将二进制文件与目标文件和库链接时,顺序很重要。提供导出符号的共享库必须遵循导入这些符号的目标文件和其他共享库。在您的情况下,共享库必须放在 c++ 命令邀请的末尾:

c++ -o test1 -std=c++11 -I /usr/include/mysql-cppconn-8/ testfile.cpp  -lmysqlcppconn8

编译testfile.cpp后发现的未定义符号将从以下libmysqlcppconn8.so中导入。链接器不记得从以前的库中导出的符号。欲了解更多信息,请阅读这篇精彩的文章:Why does the order in which libraries are linked sometimes cause errors in GCC。

【讨论】:

太棒了,非常感谢!我也一定会查看该链接以了解有关链接的更多信息。

以上是关于解决链接器错误 MySQL 连接器/C++的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 链接器未加载库

如何解决 C++Builder 中的链接器错误“LIBCURL.LIB 包含无效的 OMF 记录,类型 0x21(可能是 COFF)”?

Apple Mach-O链接器(id)错误 - 链接器命令失败,退出代码为1(使用-v查看调用)C ++ SFML

亲测有效无法定位链接器!请检查 toolslink.ini 中的配置是否正确的解决方案

C++ / VS 2012 - 多项目解决方案:一个项目中的链接器错误但另一个项目中没有

XE6 Ansi/Unicode 字符串链接器错误(未解决的外部问题)