环境:
Windows10
VsCode C++ mysql
目录:
一、undefined reference to 问题分析
二、简单与介绍区分VsCode的两种编译运行代码的两种方法(F5编译和CodeRunner)
三、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 }
在大致了解问题出现的原因后,我们应当如何去链接库文件呢?
通过修改对应的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 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文件夹路径),大概长这样(第三行):
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------