C++ / mysql连接器-未定义对get_driver_instance的引用-已经尝试过简单的东西

4si2a6ki  于 2023-02-20  发布在  Mysql
关注(0)|答案(4)|浏览(158)

是的,这个问题以前有人问过......我已经尝试了前面答案中提到的所有方法。我的设置非常简单,所以这应该不难。
我只是想用C++编写一个针对mysql的程序。我的源代码是从下面的'hello world'类型示例中逐字提取的:
http://dev.mysql.com/doc/refman/5.1/en/connector-cpp-examples-complete-example-1.html
我使用的是Ubuntu 12.10。我正在尝试:

g++ -Wall -o firsttry_prog -I/usr/include/mysqlcppconn -I/usr/local/boost_1_53_0  -L/usr/lib/x86_64-linux-gnu -l:libmysqlclient_r.so.18 -L/usr/lib/mysqlcppconn -lmysqlcppconn  firsttry.cpp

它可以编译(如果我使用-c选项),但不会构建,这给了我一个臭名昭著的问题:

/tmp/ccn768hj.o: In function `main':
firsttry.cpp:(.text+0x3a): undefined reference to `get_driver_instance'

一些细节:

    • 'firsttry.cpp'* 就是我对源代码文件的命名,同样是从官方示例中逐字引用的
  • 正如您所看到的,我正在 mysqlclient 库和 mysqlcppconn 库中进行链接。以前多次有人问过这个问题,答案是链接它们。
  • 一些其他的历史答案表明示例源代码是错误的,并且有问题的函数需要在sql::mysql命名空间中,等等。我非常肯定源代码是好的。同样,它可以编译,并且在源代码中更改命名空间似乎会使情况更糟。

提前感谢您所能提供的任何帮助。

sc4hvdpw

sc4hvdpw1#

所以我现在有这个问题一个星期了,我变得非常沮丧,我刚刚终于能够建立一个程序,什么也不做,除了登录到mysql,我真的尖叫着高兴,这是我有,我希望它能有所帮助。
我首先从源代码编译了c++连接器库,但过了一段时间,我想可能我做错了什么,所以我就用apt来获得它:

sudo apt-get install  libmysqlcppconn-dev

下面是我的简单测试器源文件“tester.cpp”

#include <stdlib.h>
#include <iostream>
#include <mysql_connection.h>
#include <driver.h>
#include <exception.h>
#include <resultset.h>
#include <statement.h>

using namespace sql;
int main(void){
  sql::Driver *driver;
  sql::Connection *con;

  driver = get_driver_instance();
  con = driver->connect("tcp://127.0.0.1:3306","root","YOURPASSWORD");
  
  return 0;
}

最后是g++编译命令:

g++ -Wall -I/usr/include/cppconn -o testapp tester.cpp -L/usr/lib -lmysqlcppconn

这对我很有效,我希望它能帮助你解决你的问题!

z2acfund

z2acfund2#

对我来说,简单地交换最后两个参数的顺序就解决了这个问题,我不知道为什么,但是如果我在源文件后面指定-lmysqlcppconn选项,链接器就能够找到函数get_driver_instance

g++ -Wall -o firsttry_prog -I/usr/include/mysqlcppconn -L/usr/lib/mysqlcppconn firsttry.cpp -lmysqlcppconn

还请注意,我删除了以下选项,因为我认为它们是多余的

-I/usr/local/boost_1_53_0  -L/usr/lib/x86_64-linux-gnu -l:libmysqlclient_r.so.18
7dl7o3gd

7dl7o3gd3#

如果你像我一样健忘,没有在CMakeLists.txt中链接库:

target_link_libraries(<target> mysqlcppconn)
9vw9lbht

9vw9lbht4#

如果包含了所有的路径,则抛出param -I。如果像这样编译,您将看到是否存在问题:

g++ -g  -o0  -I/usr/local/include -I/usr/local/boost/include -c main.cpp -o main.o
g++ -g  -o0 -L/usr/local/lib -L/usr/local/mysql/lib -lmysqlcppconn  main.o  -o test

就会出现问题:

main.o: In function `main':
/home/huangxw/workspace/public/soal/test/main.cpp:165: undefined reference to `get_driver_instance'
collect2: ld returned 1 exit status

现在必须调整-lmysqlcppconnmain.o的顺序:

g++ -g  -o0  -I/usr/local/include -I/usr/local/boost/include -c main.cpp -o main.o
g++ -g  -o0 -L/usr/local/lib -L/usr/local/mysql/lib main.o  -o test  -lmysqlcppconn

仅此而已!!原因很简单。你可以用网络查出来,或者让我详细说明。

相关问题