mysql_init(NULL)使使用wamp64服务器的C程序崩溃

ovfsdjhp  于 2023-01-16  发布在  Mysql
关注(0)|答案(1)|浏览(75)

我正在用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”。
  • 制作另一个项目只是为了将其导入到另一个项目中(也无法工作)
xfb7svmp

xfb7svmp1#

事实证明,我只是不明白这实际上是如何工作的。.dll文件根本不在CLion的调试功能编译程序的文件中,我所要做的就是将它们复制并粘贴到所说的文件中。抱歉给您带来不便,希望这可能会帮助到其他困惑的学生。

相关问题