使用交叉编译器和 VisualGDB 时未定义对 mysql 的引用
Undefined reference to mysql while using cross-compiler and VisualGDB
我正在尝试使用 VisualGDB 和交叉编译器为 Raspberry PI 编译简单的 C++ 程序。我已经完成了教程中的所有内容 http://visualgdb.com/tutorials/raspberry/wiringPi/ 并设法 运行 对闪烁的 LED 应用程序进行了示例,因此一切似乎都已配置好。
现在我想添加一些 mysql 支持来记录更改和读取一些配置信息。
#include <wiringPi.h>
#include <mysql/mysql.h>
int main(int argc, char *argv[])
{
wiringPiSetup();
MYSQL *mysql1 = mysql_init(NULL);
}
不幸的是,我收到错误:
'NULL' was not declared in this scope
我试图包括
#include <mysql/my_global.h>
header,因此不再未声明 NULL,但显示另一个错误:
error VGDB1000: undefined reference to `mysql_init'
我做错了什么?
编辑
添加了我的设置的屏幕截图。 TBH 我不太了解 gcc...可能这就是我使用 VisualGDB 的原因 ;)
我尝试将其添加到 LDFLAGS:
`mysql_config --cflags` `mysql_config --libs`
但是我得到一个错误:
Tool arguments: -Wl,--start-group "C:\Users\Marek\AppData\Local\Temp\/VisualGDB_ToolchainTestProgram.o" -o "C:\Users\Marek\AppData\Local\Temp\/VisualGDB_ToolchainTestProgram" -Wl,-gc-sections `mysql_config --cflags` `mysql_config --libs` -lpthread -lwiringPi -Wl,--end-group
arm-linux-gnueabihf-gcc.exe: error: `mysql_config: No such file or directory
arm-linux-gnueabihf-gcc.exe: error: `mysql_config: No such file or directory
NULL
定义在stdio.h
,所以你只需要
#include <stdio.h>
或
#include <iostream>
或者自己定义:
#define NULL 0
关于undefined reference to 'mysql_init'
,不是define NULL造成的
此错误来自链接步骤,因此这意味着当您使 NULL 有效(这是由编译步骤引起的错误)时,将显示链接步骤的错误。
仔细检查头文件中mysql_init
的定义。
好的,我设法解决了问题。我在这里找到了非常有用的提示:https://sysprogs.com/w/forums/topic/include-mysqlmysql-h-errorundefined-reference-to/
You need to add the MySQL library to the ‘libraries’ setting in the VisualGDB Project Properties. Specify the name without the ‘lib’ prefix and ‘.a’ suffix. E.g. if the library name is libmysql.a, simply specify ‘mysql’ in the ‘libraries’ field.
You may also need to put extern “C” around the include file if it does not contain it.
我尝试将 "mysql" 添加到 库名称 部分,但正确的名称是 mysqlclient.
无需使用 extern 或添加 LDFLAGS。
所以每当你想添加新的库时,检查你的库目录中是否有合适的文件。
感谢您的评论,他们引导我找到这个解决方案。
非常抱歉为此做了额外的回答,但由于缺乏声誉我无法发表评论...
马克的回答是正确的,让我想到了这个。
但是,当使用 CMake 而不是 Makefile 创建项目时,"Library Names" 选项不会出现在 VisualGDB 设置中。
然后您应该转到包含项目的实际代码的 "Properties",转到 "Exported Settings" => "Public" => "Additional Libraries"。
在这里你可以像Mark指出的那样,不加任何东西地填写图书馆的名字。
我不确定这是否与 Mark 添加它们的方式完全相同,但它适用于 VS2019。
我正在尝试使用 VisualGDB 和交叉编译器为 Raspberry PI 编译简单的 C++ 程序。我已经完成了教程中的所有内容 http://visualgdb.com/tutorials/raspberry/wiringPi/ 并设法 运行 对闪烁的 LED 应用程序进行了示例,因此一切似乎都已配置好。
现在我想添加一些 mysql 支持来记录更改和读取一些配置信息。
#include <wiringPi.h>
#include <mysql/mysql.h>
int main(int argc, char *argv[])
{
wiringPiSetup();
MYSQL *mysql1 = mysql_init(NULL);
}
不幸的是,我收到错误:
'NULL' was not declared in this scope
我试图包括
#include <mysql/my_global.h>
header,因此不再未声明 NULL,但显示另一个错误:
error VGDB1000: undefined reference to `mysql_init'
我做错了什么?
编辑
添加了我的设置的屏幕截图。 TBH 我不太了解 gcc...可能这就是我使用 VisualGDB 的原因 ;)
我尝试将其添加到 LDFLAGS:
`mysql_config --cflags` `mysql_config --libs`
但是我得到一个错误:
Tool arguments: -Wl,--start-group "C:\Users\Marek\AppData\Local\Temp\/VisualGDB_ToolchainTestProgram.o" -o "C:\Users\Marek\AppData\Local\Temp\/VisualGDB_ToolchainTestProgram" -Wl,-gc-sections `mysql_config --cflags` `mysql_config --libs` -lpthread -lwiringPi -Wl,--end-group
arm-linux-gnueabihf-gcc.exe: error: `mysql_config: No such file or directory
arm-linux-gnueabihf-gcc.exe: error: `mysql_config: No such file or directory
NULL
定义在stdio.h
,所以你只需要
#include <stdio.h>
或
#include <iostream>
或者自己定义:
#define NULL 0
关于undefined reference to 'mysql_init'
,不是define NULL造成的
此错误来自链接步骤,因此这意味着当您使 NULL 有效(这是由编译步骤引起的错误)时,将显示链接步骤的错误。
仔细检查头文件中mysql_init
的定义。
好的,我设法解决了问题。我在这里找到了非常有用的提示:https://sysprogs.com/w/forums/topic/include-mysqlmysql-h-errorundefined-reference-to/
You need to add the MySQL library to the ‘libraries’ setting in the VisualGDB Project Properties. Specify the name without the ‘lib’ prefix and ‘.a’ suffix. E.g. if the library name is libmysql.a, simply specify ‘mysql’ in the ‘libraries’ field. You may also need to put extern “C” around the include file if it does not contain it.
我尝试将 "mysql" 添加到 库名称 部分,但正确的名称是 mysqlclient.
无需使用 extern 或添加 LDFLAGS。
所以每当你想添加新的库时,检查你的库目录中是否有合适的文件。
感谢您的评论,他们引导我找到这个解决方案。
非常抱歉为此做了额外的回答,但由于缺乏声誉我无法发表评论...
马克的回答是正确的,让我想到了这个。 但是,当使用 CMake 而不是 Makefile 创建项目时,"Library Names" 选项不会出现在 VisualGDB 设置中。
然后您应该转到包含项目的实际代码的 "Properties",转到 "Exported Settings" => "Public" => "Additional Libraries"。 在这里你可以像Mark指出的那样,不加任何东西地填写图书馆的名字。
我不确定这是否与 Mark 添加它们的方式完全相同,但它适用于 VS2019。