自由屋推书网—热门的小说推荐平台!

你的位置: 首页 > mysql

C++连接mysql数据库报错“undefined reference to”解决方法

2022-05-17 13:49:08

环境:

  • Windows10
  • VsCode C++ mysql

一、undefined reference to 问题分析

错误如下:

undefined reference to `mysql_init'
undefined reference to `mysql_real_connect'

这个问题的原因大概率是:(默认VsCode和mysql的配置没有问题)

没有链接到库文件

解决方法就是链接mysql的库文件。(如果在Vsual studio中可能就直接在首选项中添加依赖文件路径了,但在VsCode里我们需要添加相应的语句去达到相同的目的)

这里稍微提一嘴头文件和库文件的区别:

1.头文件中是函数或定义的声明,及少量内联函数的使用(一般不包含非静态函数实现)

2.库文件中包含函数的实现

所以如果是头文件包含(测试代码的第三行)出错,那么在写代码时调用mysql相关语句就会有波浪线错误提示。如果硬要编译的话,会出现如下错误提示如下:

  error: 'MYSQL' was not declared in this scope

  error: 'my_sql' was not declared in this scope

既然代码本身没有波浪线报错,就说明头文件的包含是没有问题的,出错的原因就是只有声明没有实现,也就是没有链接到库文件。

测试代码如下:(测试代码名为:test.cpp)

#include<iostream>
  //前面是你mysql头文件目录
  #include "D:/ROUTE/mysql8/include/mysql.h"
  using namespace std;
  int main(){
      MYSQL my_sql;
      mysql_init(&my_sql);
      if(!mysql_real_connect(&my_sql,"localhost","root","123456","test",3306,NULL,0)){
          cout << "error"<<endl;
     }
     else{
         cout << "success"<<endl;
     }
     return 0;
 }

二、简单介绍与区分VsCode的两种编译运行代码的两种方法(F5编译和CodeRunner)

在大致了解问题出现的原因后,我们应当如何去链接库文件呢?

通过修改对应的json文件。

首先明确一点,VsCode的实现代码编译运行的方式就是json文件帮你去执行g++命令

可以直接在终端窗口中通过命令去编译运行,例如:

在使用F5编译或Code Runner编译时,如果注意终端信息,也会有体现

由于不同编译代码方法依赖的json文件是不同的,为了确保修改的json文件是正确的,所以我们先简单区分一下Vscode的两种常见编译代码的方法:

1.F5编译(也就是菜单栏启动调试)

主要通过launch.json和tasks.json两个文件执行g++命令进行代码编译(.vscode文件夹下)

启动方法就是菜单栏->运行->启动调试,或F5

2.Code Runner插件(大多数Vscode配置教程中都会推荐安装的插件)

主要通过setting.json文件执行g++命令进行代码编译(设置中Run Code configuration,Code-runner点击可以跳转到setting.json)

启动方法是右上角的小三角

三、undefined to 问题解决方法

通过一和二,大致知道了undefined reference to 问题出现的原因,也了解了VsCode编译运行代码,看看下图,相信你对这个问题的解决方式已经有点眉目了。

正确运行和错误运行的区别就是多了“-L D:/ROUTE/mysql8/lib -l mysql”,根据之前的分析,这条语句的作用就是链接库文件。

简单解释一下:

-L参数:指定库文件所在的目录名

后跟就是mysql中lib文件夹的路径

-l参数(小写的L):就是用来指定程序要链接的库

下面分别介绍两种编译方法下json文件的修改方法:

(注:一定要根据自己使用的编译代码方法,在对应的json文件中添加语句(task.json或setting.json))

1 F5编译

在tasks.json文件里的arg[] 中的添加语句(tasks.json文件在.vscode文件夹中)

"-L",
"D:/ROUTE/mysql8/lib",//自己电脑上mysql的路径
"-l mysql",

注:

1.添加的语句与arg[]中其他语句的排列顺序不影响结果

2.注意逗号,注意引号,注意斜杠方向

{
      "args": [
            "${file}",
            
            "-L",
            "D:/ROUTE/mysql8/lib",//自己电脑上mysql的路径
            "-lmysql",

            "-o",  
            "${fileDirname}/${fileBasenameNoExtension}.exe",
         //有的配置文件时候这之后也有很多参数,如果你其他代码运行正常的话就不用管它们
        ], 
}

2. Code Runner

在设置中搜索runner,点击可以跳转到setting.json。(设置中Run Code configuration,Code-runner 下面“在setting.json中编辑”)

在setting.json中的"code-runner.executorMap": {} 中的“cpp”之后:修改

 "code-runner.executorMap": {
        //原本可能是:"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt ",
         "cpp": "cd $dir && g++ -I \"D:/ROUTE/mysql8/include\"  '*.cpp' -L \"D:/ROUTE/mysql8/lib\" -l mysql  -o  $fileNameWithoutExt && $dir$fileNameWithoutExt",
        //-I:指定头文件目录        -L:指定程序要链接的库     -o:生成exe文件
    //这里可能还有许多其他语言的编译命令,如果你其他代码运行正常的话就不用管它们,主要看cpp
    }

简单解释:

-I参数(大写的i):指定头文件目录

后跟就是mysql中include文件夹的路径

注:

1.在这里不加-I(大写的i)和头文件目录就会出错,可能是code runner和F5编译在其他设置上有区别

2.注意逗号,注意引号,注意斜杠方向

四、其他

1.c_cpp_properties.json

有些相关问题的帖子可能会提到c_cpp_properties.json。如果这个json文件的话,是在.vscode文件夹下,所以是与F5编译有关的。

多数可能是让你在"includePath": []中添加mysql的头文件目录(include文件夹路径),大概长这样(第三行):

"includePath": [
                "${workspaceFolder}/**",
               "D:/ROUTE/mysql8/include"
            ],

这个做法跟解决undefined to 的问题确实没啥关系,但也不是完全没用。如果添加了mysql的include路径,在代码的头文件引用中就不用添加include路径了(即可以直接写成第二行的样子),但是可能会出现波浪线错误。

#include "D:/ROUTE/mysql8/include/mysql.h"
#include "mysql.h"

 

编辑推荐

热门小说