【发布时间】:2018-02-02 10:14:50
【问题描述】:
我正在尝试进行嵌入式 MariaDB(即不连接到正在运行的服务器)设置,但我发现任何示例都无法正常工作。
我最近的例子来自这篇帖子https://stackoverflow.com/a/24548826/400048
当应用程序运行时,它会产生:
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
文档https://mariadb.com/kb/en/library/embedded-mariadb-interface/ 对此没有太大帮助。
为方便起见,StackOverflow 帖子中的代码如下:
#include <my_global.h>
#include <mysql.h>
int main(int argc, char **argv) {
static char *server_options[] = {
"mysql_test", // An unused string
"--datadir=/tmp/mysql_embedded_data", // Your data dir
NULL };
int num_elements = (sizeof(server_options) / sizeof(char *)) - 1;
static char *server_groups[] = { "libmysqld_server",
"libmysqld_client", NULL };
// Init MySQL lib and connection
mysql_library_init(num_elements, server_options, server_groups);
MYSQL *con = mysql_init(NULL);
if (con == NULL) {
fprintf(stderr, "%s\n", mysql_error(con));
exit(1);
}
mysql_options(con, MYSQL_READ_DEFAULT_GROUP, "libmysqld_client");
mysql_options(con, MYSQL_OPT_USE_EMBEDDED_CONNECTION, NULL);
// Connect to no host/port -> Embedded mode
if (mysql_real_connect(con, NULL, NULL, NULL, NULL, 0, NULL, 0) == NULL) {
fprintf(stderr, "%s\n", mysql_error(con));
mysql_close(con);
exit(1);
}
// Create a sample empty DB, named "aNewDatabase"
if (mysql_query(con, "CREATE DATABASE aNewDatabase")) {
fprintf(stderr, "%s\n", mysql_error(con));
mysql_close(con);
exit(1);
}
// Close connection
mysql_close(con);
exit(0);
}
我粗略地看了一下https://github.com/MariaDB/server,但不知道该去哪里寻找……或者实际上我在寻找什么。
如何让嵌入式 mariadb 运行?
我在 Mac OS High Sierra 上运行,MariaDB 使用brew install mariadb --with-embedded 安装。
更新:
我很确定我链接到了正确的库。
ls /usr/local/lib | grep maria
FIND_LIBRARY(mariadb mariadb)
MESSAGE(FATAL_ERROR "BOOM ${mariadb}")
其中的输出是:
BOOM /usr/local/lib/libmariadb.dylib
更新 2
我现在链接到以下内容。请注意,我从 libmysqld 开始并添加了库,直到所有链接错误都消失了。这里的问题是我可能没有所有正确的库或版本。
TARGET_LINK_LIBRARIES(sql_fn /usr/local/lib/libmysqld.a)
TARGET_LINK_LIBRARIES(sql_fn /usr/local/opt/openssl/lib/libcrypto.a)
TARGET_LINK_LIBRARIES(sql_fn /usr/local/opt/openssl/lib/libssl.a)
TARGET_LINK_LIBRARIES(sql_fn /usr/local/opt/bzip2/lib/libbz2.a)
TARGET_LINK_LIBRARIES(sql_fn /usr/local/lib/liblz4.a)
TARGET_LINK_LIBRARIES(sql_fn /usr/local/opt/zlib/lib/libz.a)
TARGET_LINK_LIBRARIES(sql_fn /usr/local/opt/xz/lib/liblzma.a)
TARGET_LINK_LIBRARIES(sql_fn /usr/local/lib/libsnappy.a)
Process finished with exit code 6
查看https://stackoverflow.com/a/7495907/400048,如果它指向相同的东西/仍然正确,那么退出代码6 表示EX_ILLEGAL_TABLE 6,不幸的是我不知道那会是什么表。传入的 mysql_test 和 datadir 字符串是有效的标识符/路径。
【问题讨论】:
-
一个问题,
/tmp/mysql.sock是否存在...如果不存在,则尝试使用touch /tmp/mysql.sock创建一个新的,然后尝试再次运行您的应用程序。 -
创建文件确实会将错误消息从:
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)更改为Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)。恐怕没什么别的了。 -
@zcourts:你是在链接 libmysqlclient.a 还是 libmysqld.a ?
-
libmariadb.dylib,如果文件名可以通过,则不是客户端。 -
@zcourts:好吧,我们在这个评论线程上的空间即将用完(cmets 不适合扩展讨论)。在调试器中设置断点并确保已创建连接。如果是,那么您就知道服务器是实时的,并且问题在于创建文件,这实际上取决于操作系统,而不是服务器。