嵌入式mariadb c/c++api

bqucvtff  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(564)

我正试图让一个嵌入式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 post的代码为:


# 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 但我不知道该去哪里找…或者我在找什么。一个人怎样才能得到一个真正的工作呢?我在mac os high sierra上运行,mariadb安装了 brew install mariadb --with-embedded .
更新:
我很确定我链接到了正确的lib。 ls /usr/local/lib | grep maria

FIND_LIBRARY(mariadb mariadb)
MESSAGE(FATAL_ERROR "BOOM ${mariadb}")

其输出为: BOOM /usr/local/lib/libmariadb.dylib 更新2
我现在链接到以下内容。请注意,我从libmysqld开始,并添加了库,直到所有链接错误都消失。这里的问题是我可能没有所有正确的lib或版本。

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)

它现在编译,但退出代码6
Process finished with exit code 6 看着https://stackoverflow.com/a/7495907/400048 如果它指向相同的东西/仍然是真的,那么退出代码6意味着 EX_ILLEGAL_TABLE 6 很不幸,我不知道那是什么table。这个 mysql_test 传入的和datadir字符串是有效的标识符/路径。

wj8zmpe1

wj8zmpe11#

好的,首先对你的例子做一点解释。用户正在使用gcc进行编译,我可以看到您正在使用cmake。首先是什么-lz和 mysql_config --include --libmysqld-libs 手段。第一个是link zlib to link zlib in cmake你可以参考这个答案,但长话短说:

find_package( ZLIB REQUIRED )
if ( ZLIB_FOUND )
    include_directories( ${ZLIB_INCLUDE_DIRS} )
    target_link_libraries( sql_fn ${ZLIB_LIBRARIES} )
endif( ZLIB_FOUND )

然后你需要mariadb库,这是第二部分。 mysql_config --include --libmysqld-libs 这意味着执行命令mysql\u config--include--libmysqld libs,它将返回一个带有链接选项的字符串,因此执行以下命令:

$mysql_config --include --libmysqld-libs
-I/usr/local/mysql/include
-L/usr/local/mysql/lib  -lmysqld

你应该得到一个像上面那样的输出。i是在一个给定的目录中查找头文件,-l是在一个目录中搜索库文件,-l是链接一个给定的库文件,它的作用与-lz相同,只是你在添加-lmysqld。
好吧,现在所有的解释你只需要包括-i-l和-l选项与mysql然而,这不是这样一个标准的库,所以你需要包括目录和库,通过一个脚本,如本文所解释的。所以长话短说,这里没有防弹措施,例如我的库在/usr/local/mysql/lib中,而你的库在/usr/local/lib中。既然是这样,那么使用第二种方法就更容易了。

execute_process(COMMAND mysql_config --include
    OUTPUT_VARIABLE MYSQL_INCLUDE)
execute_process(COMMAND mysql_config --libmysqld-libs
    OUTPUT_VARIABLE MYSQL_LIBS)

target_compile_options(sql_fn PUBLIC ${MYSQL_INCLUDE})
target_link_libraries(sql_fn ${MYSQL_LIBS})

这就是你所需要的全部信息。现在我们很高兴我们能让事情变得简单,不是吗这是我的cmakelists.txt

cmake_minimum_required(VERSION 3.6)
project(embedded_mysql)

set(CMAKE_CXX_STANDARD 14)

set(SOURCE_FILES main.cpp)
add_executable(embedded_mysql ${SOURCE_FILES})

find_package( ZLIB REQUIRED )
if ( ZLIB_FOUND )
    include_directories( ${ZLIB_INCLUDE_DIRS} )
    target_link_libraries( embedded_mysql ${ZLIB_LIBRARIES} )
endif( ZLIB_FOUND )

execute_process(COMMAND mysql_config --include
        OUTPUT_VARIABLE MYSQL_INCLUDE)
execute_process(COMMAND mysql_config --libmysqld-libs
        OUTPUT_VARIABLE MYSQL_LIBS)

string(STRIP ${MYSQL_LIBS} MYSQL_LIBS)

target_compile_options(embedded_mysql PUBLIC ${MYSQL_INCLUDE})
target_link_libraries(embedded_mysql ${MYSQL_LIBS})

您可以在github中看到代码

相关问题