完美解决:VsCode C++ 连接mysql数据库出现undefined reference to 的问题

2022/4/28 19:13:17

本文主要是介绍完美解决:VsCode C++ 连接mysql数据库出现undefined reference to 的问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

环境:

  Windows10

  VsCode  C++  mysql

 

目录:

  一、undefined reference to 问题分析

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

  三、undefined reference to 问题解决方法

  四、其他

 

一、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)
 1 #include<iostream>
 2 //前面是你mysql头文件目录
 3 #include "D:/ROUTE/mysql8/include/mysql.h"
 4 using namespace std;
 5 int main(){
 6     MYSQL my_sql;
 7     mysql_init(&my_sql);
 8     if(!mysql_real_connect(&my_sql,"localhost","root","123456","test",3306,NULL,0)){
 9         cout << "error"<<endl;
10     }
11     else{
12         cout << "success"<<endl;
13     }
14     return 0;
15 }

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

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

    通过修改对应的json文件。

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

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

0

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

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

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

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

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

0

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

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

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

0

三、undefined to 问题解决方法

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

0

正确运行和错误运行的区别就是多了“-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文件夹路径),大概长这样(第三行):

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

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

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

 

------20220428------



这篇关于完美解决:VsCode C++ 连接mysql数据库出现undefined reference to 的问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程