programing

내장 MariaDB C/C++ API

procenter 2023. 1. 3. 22:32
반응형

내장 MariaDB C/C++ API

임베디드 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을 대충 훑어보았지만, 실제로 어디를 찾아야 할지 몰랐습니다.아니면 무엇을 찾아야 할지 몰랐습니다.내장형 마리아답은 어떻게 작동합니까?Mac OS High Sierra에서 실행 중인데 MariaDB가 설치되었습니다.brew install mariadb --with-embedded.

갱신:

나는 내가 올바른 lib에 링크하고 있다고 확신한다.

ls /usr/local/lib | grep maria

마리아DB

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)

이제 컴파일되지만 코드 6으로 종료됩니다.

Process finished with exit code 6같은 것을 가리키고 있는 경우, https://stackoverflow.com/a/7495907/400048 를 참조해 주세요./그렇다면, 종료 코드 6은 다음과 같습니다.EX_ILLEGAL_TABLE 6아쉽게도 어떤 테이블인지 모르겠어요.mysql_test및 전달된 datadir 문자열은 유효한 식별자/경로입니다.

네, 먼저 당신의 예에 대해 간단히 설명하겠습니다.사용자는 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_config --sysql --libs --libs --libs 명령을 실행합니다.이 명령어는 링크 옵션을 포함한 문자열을 반환하기 때문에 다음 명령을 실행합니다.

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

그리고 위와 같은 출력이 나올 것입니다.-I는 지정된 디렉토리에서 헤더를 찾고 -L은 디렉토리 내의 라이브러리를 검색합니다.-l은 -lz와 동일한 목적을 가진 특정 라이브러리를 링크하는 것입니다.-lmysqld를 추가합니다.

이제 설명되었으니 mysql에 -I -L 옵션과 -l 옵션만 포함하면 됩니다만, 이것은 표준 라이브러리가 아니기 때문에, 이 anwer에 설명된 대로 스크립트를 통해 디렉토리와 라이브러리를 포함해야 합니다.다시 한 번 말씀드리지만, 예를 들어 제 라이브러리는 /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})

필요한 정보는 여기까지입니다.이제 Cmake가 있어서 더 편해졌죠?;) 여기 제 Cmake Lists 입니다.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에서 코드를 볼 수 있습니다.

언급URL : https://stackoverflow.com/questions/48290358/embedded-mariadb-c-c-api

반응형