链接时对 `check(std::string const&)' 的未定义引用

问题描述 投票:0回答:2

我有一些 C++ 中的“简单”代码来连接到 MySQL 数据库(顺便说一句,这是 localhost)。

#include <stdlib.h>
#include <iostream>
#include "mysql/include/mysql/jdbc.h"


using namespace sql;


int main() {

  std::cout << "Test"<< std::endl;

  try {
   sql::Driver *myDriver;
   sql::Connection *myConn;
   sql::Statement *myStmt;
   sql::ResultSet *myRes;

   myDriver = sql::mysql::get_mysql_driver_instance();
   myConn = myDriver ->connect("tcp://127.0.0.1", "root", "");
   myConn->setSchema("root");

   myStmt = myConn->createStatement();
   myRes = myStmt->executeQuery("SELECT 'Hello World' AS _message");

   while (myRes->next()) {
     std::cout << myRes->getString("_message") << std::endl;
   }
   delete myRes;
   delete myStmt;
   delete myConn;

 } catch (sql::SQLException &e) {
   std::cout << "Filed connect to Database" << std::endl;
   std::cout << "Error: " << e.what() << std::endl;
   std::cout << "Error code: " << e.getErrorCode() << std::endl;
 }
}

文件

jdbc.h
只是头文件的很多不同
#include

我使用2个命令来编译:

g++ -c -Wall -I/usr/include/cppconn connect.cpp -o connect.o
g++ -lm -L/usr/lib/x86_64-linux-gnu -lmysqlcppconn connect.o -o connect

这产生了这个链接错误:

/usr/bin/ld: connect.o: in function "check_lib()':
connect.cpp:(.text+0x2c): undefined reference to `check(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)"
/usr/bin/ld: connect.cpp:(.text+0x77): undefined reference to "check(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)"
/usr/bin/ld: connect.o: in function `sql::mysql::get_driver_instance_by_name(char const*)':
connect.cpp:(.text+0xfa): undefined reference to   "sql::mysql::_get_driver_instance_by_name(char const*)"
collect2: error: ld returned 1 exit status

我使用这个答案解决了这个问题:https://stackoverflow.com/a/33395489/14814564,本质上是通过将

#define _GLIBCXX_USE_CXX11_ABI 0 
放在文件顶部,编译后会产生此链接错误:

/usr/bin/ld: connect.o: in function "check_lib()':
connect.cpp:(.text+0x2c): undefined reference to "check(std::string const&)'
/usr/bin/ld: connect.cpp:(.text+0x77): undefined reference to "check(std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > const&)'
/usr/bin/ld: connect.o: in function `sql::mysql::get_driver_instance_by_name(char const*)':
connect.cpp:(.text+0xfa): undefined reference to "sql::mysql::_get_driver_instance_by_name(char const*)'
collect2: error: ld returned 1 exit status

为什么不断弹出此链接错误以及如何解决它?

c++ linker-errors mysql-connector
2个回答
1
投票

我遇到了同样的问题,我通过构建 Makefile 解决了它`

 MYSQL_CONCPP_DIR = ./mysql
 CPPFLAGS=-I $(MYSQL_CONCPP_DIR)/include/mysql -L $(MYSQL_CONCPP_DIR)/lib64
 LDLIBS=-lmysqlcppconn
 CXXFLAGS=-std=c++11
 out.exe:test.cpp
     g++ test.cpp ${LDLIBS} ${CXXFLAGS} ${CPPFLAGS} -o out.exe

你那里有 #include“mysql/include/mysql/jdbc.h”

就我而言,包含需要像这样完成` #包括


0
投票

如果可以的话,使用较旧的 GCC 编译您的应用程序,或者使用与您的应用程序相同的编译器来编译 Connector/C++ 库。

经过大量谷歌搜索后,一些随机问题跟踪器中的评论提示我尝试使用较旧的编译器。

我在一个 HPC 站点工作,那里有 GCC 的

环境模块,所以我能够随意加载旧版本。 GCC 5.2.0 最终对我有用,尽管 MySQL Connector/C++ 8.0.29 附带的 INFO_BIN

 说他们是用 GCC 8.3.1 编译的。

从(大约)

gcc/5.4.0

开始的一切都是禁止的:

$ module list Currently Loaded Modulefiles: 1) mysql-connector-cplusplus/8.0.29 $ module load gcc/4.9.0 $ g++ -std=c++11 $CPPFLAGS $CXXFLAGS -lmysqlcppconn simple.cpp $ module unload gcc; module load gcc/5.2.0 $ g++ -std=c++11 $CPPFLAGS $CXXFLAGS -lmysqlcppconn simple.cpp $ module unload gcc; module load gcc/5.4.0 $ g++ -std=c++11 $CPPFLAGS $CXXFLAGS -lmysqlcppconn simple.cpp /tmp/ccs8BopW.o: In function `check_lib()': simple.cpp:(.text+0x1d): undefined reference to `check(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' ⋮ $ module unload gcc; module load gcc/9.3.0 $ g++ -std=c++11 $CPPFLAGS $CXXFLAGS -lmysqlcppconn simple.cpp /tmp/cc3S5qs2.o: In function `check_lib()': simple.cpp:(.text+0x1d): undefined reference to `check(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' ⋮ collect2: error: ld returned 1 exit status
我对这个问题的理解很模糊,但根据该问题评论、各种 C++ 论坛中的一些讨论以及 

GCC 文档,看起来 GCC 5.1 中更改了字符串的应用程序二进制接口。

也许 Oracle 使用您在不同地方提到的

-D_GLIBCXX_USE_CXX11_ABI=0

 编译了该版本的 Connector/C++。也许这个问题在连接器库的下一版本中就消失了。所有的猜测都是我的。不过,至少我知道发生了什么事并有解决方法。 
:)

    

© www.soinside.com 2019 - 2024. All rights reserved.