我正在用C语言做一个学校的项目,在这个项目中我需要连接一个本地数据库。为此,我使用了一个wamp 64本地服务器。然而,我的问题完全超出了我的理解范围。编译器似乎检测到并正确地导入了必要的库,我相信这是MYSQL C API,但是一旦我使用mysql = mysql_init,它就崩溃了(NULL)命令,这有点问题,每次结果都一样:
进程结束,退出代码为-1073741515(0xC 0000135)下面是main. c文件的代码,我在其中运行测试命令:(是的,我也在使用GTK,如果这会导致问题的话)
#include <stdio.h>
#include <winsock.h>
#include <MYSQL/mysql.h>
#include <gtk-4.0/gtk/gtk.h>
#include <stdlib.h>
#include <string.h>
#include "createMenu.h"
#include "databaseMenu.h"
static void activate(GtkApplication* app, gpointer user_data);
int main (int argc, char **argv);
static void activate (GtkApplication* app, gpointer user_data)
{
GtkWindow *window;
window = gtk_application_window_new (app);
gtk_window_set_title (GTK_WINDOW (window), "Database C Editor");
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
GtkWidget* content;
content = prepareDataBaseScreen();
gtk_window_set_child(window, content);
gtk_widget_show (window);
}
int main (int argc, char **argv)
{
GtkApplication *app;
int status;
MYSQL * mysql;
mysql = mysql_init(NULL); // Erreur ici
mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "option");
if (mysql_real_connect(mysql, "localhost", "root", "", NULL, 0, NULL, 0))
{
g_print("Success");
} else {
g_print("Failure");
}
mysql_close(mysql);
app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}
我怀疑它来自main函数以外的任何地方,但以防万一我把整个代码放在那里。现在,因为它也可能是链接的,我想给予你我的项目的CMakeLists.txt,我在那里导入我正在使用的两个库:
cmake_minimum_required(VERSION 3.18)
project(ProjectCESGI LANGUAGES C)
find_package(PkgConfig REQUIRED)
pkg_check_modules(GTK4 REQUIRED IMPORTED_TARGET gtk4)
include_directories("C:/wamp64/bin/mariadb/mariadb10.6.5/include")
link_directories("C:/wamp64/bin/mariadb/mariadb10.6.5/lib")
link_libraries(libmariadb)
add_executable(ProjectCESGI main.c createMenu.h databaseMenu.h columnWidget.h)
target_link_libraries(ProjectCESGI PRIVATE PkgConfig::GTK4 libmariadb)
最后,我的老师给了我们一个示例代码,其中他使用了相同的库。令人震惊的是,这个代码实际上可以在我的机器上运行。下面是他的main.c:
#include <stdio.h>
#include <winsock.h>
#include <MYSQL/mysql.h>
#include <stdlib.h>
int main() {
MYSQL *mysql;
mysql = mysql_init(NULL);
mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "option");
if (mysql_real_connect(mysql, "localhost", "root", "", NULL, 0, NULL, 0)) {
printf("MySQL client version: %s\n", mysql_get_client_info());
mysql_query(mysql, "CREATE DATABASE IF NOT EXISTS dbexample");
mysql_query(mysql, "USE dbexample");
mysql_query(mysql, "DROP TABLE IF EXISTS students");
mysql_query(mysql, "CREATE TABLE students(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), class INT)");
mysql_query(mysql, "INSERT INTO students VALUES(1,'Mathieu',1)");
mysql_query(mysql, "INSERT INTO students VALUES(2,'Ryan',12)");
mysql_close(mysql);
} else {
printf("Erreur connexion à la BDD!");
}
return EXIT_SUCCESS;
}
如果你需要任何其他的,请告诉我,因为我需要这个问题解决,我已经有点绝望。谢谢你的任何答案!
编辑:有人要求我把我的老师的CMakeLists.txt以及,所以在这里:
cmake_minimum_required(VERSION 3.12)
project(test C)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_FLAGS "-Wall")
include_directories("C:/wamp64/bin/mariadb/mariadb10.6.5/include")
link_directories("C:/wamp64/bin/mariadb/mariadb10.6.5/lib")
link_libraries(libmariadb)
add_executable(test main.c)
target_link_libraries(test libmariadb)
# les fichiers libmariadb.dll et libmariadb.lib sont copiés de
# C:\wamp64\bin\mariadb\mariadb10.4.10\lib
# dans le dossier de compilation
# C:\Users\fredguy\CLionProjects\test\cmake-build-debug\
请注意,我已经将所有提到的“mariadb10.4.10”改为“mariadb10.6.5”,因为这是我安装的版本。请记住,它在他的示例项目中工作得很好。
编辑2:在有人指出这个特定的错误代码意味着DLL文件丢失后,我在我的debug文件夹中进行了调查,确实看起来程序没有复制libmariadb.dll和libmysql.dll文件,而当然它在老师的例子中工作。知道为什么吗?
- 使用一些方法跟踪bug,看看程序到底在哪里崩溃,让我知道mysql_init似乎确实是问题所在。
- 用谷歌搜索问题;只有论坛是在一个MYSQL论坛,似乎从来没有回答
- 将“NULL”替换为一些内容,如“0”或“mysql”。
- 制作另一个项目只是为了将其导入到另一个项目中(也无法工作)
1条答案
按热度按时间xfb7svmp1#
事实证明,我只是不明白这实际上是如何工作的。.dll文件根本不在CLion的调试功能编译程序的文件中,我所要做的就是将它们复制并粘贴到所说的文件中。抱歉给您带来不便,希望这可能会帮助到其他困惑的学生。