使用MySQL Connector C ++链接mysqlcppconn-static时出现问题

时间:2019-06-10 18:07:39

标签: c++ cmake mysql-connector

我正在写有关在安装MySQL Connector C ++时遇到的问题。我使用的是Linux(Ubuntu 18.04)连接器的二进制发行版,因此我将库目录放在我的项目之外(这是此处参考指南(https://dev.mysql.com/doc/connector-cpp/1.1/en/connector-cpp-installation-binary.html中给出的示例之一)。

在我的项目(Clion)中,我有以下cmake文件:

cmake_minimum_required(VERSION 3.14)
project(MySQLConnectorTest)

set(CMAKE_CXX_STANDARD 14)

link_directories(../mysql-connector-c++/lib64)
link_directories(/opt/lampp/lib)
add_executable(MySQLConnectorTest main.cpp)
include_directories(../mysql-connector-c++/include/jdbc)
target_link_libraries(MySQLConnectorTest mysqlclient.a)
target_link_libraries(MySQLConnectorTest mysqlcppconn-static.a)

我拥有的mySQL istallation是XAMPP提供的。因此,找到mysqlclient.a的目录是/opt/lampp/lib

问题是当链接mysqlcppconn-static.a时,在编译过程中会得到一长串错误,如下所示:

/home/riccardo/MySQLConnectorTest/../mysql-connector-c++/lib64/libmysqlcppconn-static.a(libmysqlclient_client.cc.o): 
nella funzione "ssl_verify_server_cert(Vio*, char const*, char const**) [clone .isra.7]":
./obj/libmysql/../../mysql-8.0.16/sql-common/client.cc:3283: riferimento non definito a "SSL_get_peer_certificate"
./obj/libmysql/../../mysql-8.0.16/sql-common/client.cc:3288: riferimento non definito a "SSL_get_verify_result"
./obj/libmysql/../../mysql-8.0.16/sql-common/client.cc:3359: riferimento non definito a "X509_free"
./obj/libmysql/../../mysql-8.0.16/sql-common/client.cc:3302: riferimento non definito a "X509_check_host"
./obj/libmysql/../../mysql-8.0.16/sql-common/client.cc:3304: riferimento non definito a "X509_check_ip_asc"

有人可以解释我的意思吗?有人可以建议我如何解决吗?

谢谢。

[编辑]:按照此处提供的建议,编译现在可以正常进行。我认为仍然存在一个问题,示例程序在调用connect方法时会引发异常:

/* Create a connection */
driver = get_driver_instance();
con = driver->connect("tcp://127.0.0.1:3306", "root", "root");
/* Connect to the MySQL test database */
con->setSchema("test");

我找到了有关此问题的其他帖子,例如c++ mysql connection bad_alloc using c++ connector 但这在Linux中无济于事,特别是我尝试遵循提示:

  

我在linux上有同样的错误。   错误是:我正在使用g ++-4.8构建项目   问题在于用于构建项目的构建工具(gcc,msvs,clang)的版本   通过尝试更新g ++,但我拥有最新版本。   使该库正常工作可能比编写我的应用程序所需的代码更加困难,我希望有人可以建议我接下来可以尝试什么。

谢谢

1 个答案:

答案 0 :(得分:0)

似乎我以一种简单的方式解决了。我在这里写下尝试的内容以及遇到的错误。 我再次阅读了开发者指南,似乎由于使用的库和项目使用的编译器不同,使用提供的二进制文件可能会出现问题。然后,我尝试编译源代码,以确保用于库和用于我的项目的编译器是相同的。我遵循了此指南:https://aaronxu17.github.io/blog/install-mysql-connector/

这不起作用,编译的库命名为mysqlcppconn8-static.a而不是mysqlcppconn-static.a,但是更改对该库的名称引用后我遇到了如下编译错误:

JTextPane txt_message = new JTextPane();
txt_message.setPreferredSize(new Dimension(300,300));
JScrollPane sPane = new JScrollPane(txt_message);
sPane.setHorizontalScrollBarPolicy
           (JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
sPane.setVerticalScrollBarPolicy
           (JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
sPane.setPreferredSize(new Dimension(320,320));
pnl_messagePane.add(sPane);
txt_message.setEditable(false);
DefaultCaret caret = (DefaultCaret) txt_message.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

//some other GUI elements
..... 

btn_Run.addActionListener(e->{
  for(int i=1; i<100; i++){
       appendToPanel(this.txt_message, "dummy text "+i, TextType.SUCCESS);
  }

//TextType is an enum defined in code whose value can be SUCCESS, ERROR

});



// Method for appending JTextPanel Text
private void appendToPane(JTextPane tp, String msg, TextType type)
   {
       Color c = null;
       switch(type) {
       case ERROR:
           c = Color.RED;
           break;

       case SUCCESS:
           c=Color.GREEN;
           break;
       default:
           c = Color.BLACK;
       }


       StyledDocument doc = tp.getStyledDocument();

       SimpleAttributeSet keyWord = new SimpleAttributeSet();
       StyleConstants.setForeground(keyWord, c);
       StyleConstants.setBold(keyWord, true);

       try
       {
           doc.insertString(doc.getLength(), "\n"+msg, keyWord );
       }

       catch(Exception e) { 
           System.out.println(e); 
       }

       tp.update(tp.getGraphics());

       this.sPane.update(this.sPane.getGraphics());
   }


最后我找到了这个https://stackoverrun.com/it/q/4344116,并简单地通过

解决了
reference not defined to get_driver_instance

现在所有尝试过的事情似乎对最终解决方案都是愚蠢的。我希望这可以节省其他人的时间。 谢谢