簡體   English   中英

在 Visual Studio Code 中鏈接 C++ 中的外部庫

[英]Linking external libraries in C++ in Visual Studio Code

下午好,我有一個 C++ 程序。 在 VS 代碼中。 該程序從名為 student 的表中讀取所有數據。 我使用命令g++ retrieveDataFromTable.cpp -I "C:\Program Files\MySQL\MySQL Server 8.0\include" -L "C:\Program Files\MySQL\MySQL Server 8.0\lib" -l mysql -o test編譯這個程序g++ retrieveDataFromTable.cpp -I "C:\Program Files\MySQL\MySQL Server 8.0\include" -L "C:\Program Files\MySQL\MySQL Server 8.0\lib" -l mysql -o test ,它完美地被編譯了。 這是我第一次在我的程序中使用外部庫。 因此,我觀看了一些有關鏈接如何工作以及如何將外部庫添加到我們的程序的視頻。 基本上,在那些視頻中,他們使用 Visual Studio 或 Codeblocks 來添加庫,但我使用的是 VS Code。 最終,我設法使該程序運行,但我有一些問題。 第一個是關於我包含頭文件“mysql.h”的方式。 我的意思是它看起來不專業。 如果我要在其他設備上運行這個程序,那當然沒有任何意義。 那么有人願意幫助我如何讓它變得更好嗎? 我的第二個問題是,如果我的項目文件夾中沒有 libmysql.dll,程序會終止。 我猜這是因為我與庫進行了動態鏈接(如果我錯了,請糾正我)。 那么有人知道我如何靜態鏈接這個特定的庫嗎? 總的來說,如果有人能給我一些關於如何改進這個程序的建議,以及我應該學習了解這些東西,我將不勝感激。 謝謝)

#include <iostream>
#include "C:/Program Files/MySQL/MySQL Server 8.0/include/mysql.h"

struct CONNECTION
{
    const char *server = "localhost";
    const char *user = "root";
    const char *password = "password";
    const char *database = "project";
};

MYSQL *connection_to_database(CONNECTION connection)
{
    MYSQL *newConnection = mysql_init(NULL);
    if (!newConnection)
    {
        std::cout << "Failed to create an object" << std::endl;
        std::cout << mysql_error(newConnection) << std::endl;
        exit(0);
    }
    if (!mysql_real_connect(newConnection, connection.server, connection.user,
                            connection.password, connection.database, 3306, NULL, 0))
    {
        std::cout << "Failed to connect to database:" << std::endl;
        std::cout << mysql_error(newConnection) << std::endl;
        exit(0);
    }
    return newConnection;
}

MYSQL_RES *execute_query(MYSQL *connection, const std::string query)
{
    if (mysql_query(connection, query.c_str()))
    {
        std::cout << "MYSQL query error:\n"
                  << mysql_error(connection) << std::endl;
        exit(0);
    }
    return mysql_store_result(connection);
}

int main()
{
    CONNECTION id;
    MYSQL* connection = connection_to_database(id);
    MYSQL_RES* res = execute_query(connection, "SELECT * FROM students");
    
    int rows = mysql_affected_rows(connection);
    std::cout << rows << " rows were affected" << std::endl;

    int columns = mysql_num_fields(res);
    std::cout << columns << " columns in the table" << std::endl;

    MYSQL_ROW row;
    while((row = mysql_fetch_row(res)))
    {
        for (int i = 0; i < columns; i++){
            std::cout << row[i] << " ";
        }
        std::cin.get();
    }

    return 0;
}

我看了一些問題,但找不到有用的東西。

使用CMake怎么樣? 您可以輕松地將外部庫鏈接到目標可執行文件中。

最重要的是,它是否通過CMake tools擴展在 vscode 上得到完美支持。

cmake_minimum_required(VERSION 3.25)

project(myProject)

include_directories(${CMAKE_SOURCE_DIR}/include)

link_directories(${CMAKE_SOURCE_DIR}/lib)

add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} libmysql.so)

謝謝大家的回答,我設法解決了這個問題。 但我需要做一些研究為什么它真的有效(如果你能幫助我,我將非常感激):基本上我制作了三個目錄,build,include。 庫。 我從 MYSQL Server 8.0 目錄復制的“include”和“lib”目錄。 cmake 的輸出存儲在“build”目錄中。 我在 CMakeLists:txt 中有以下命令:

cmake_minimum_required(VERSION 3.25)

project(myProject)

include_directories(${CMAKE_SOURCE_DIR}/include)

link_directories(${CMAKE_SOURCE_DIR}/lib)

add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} mysql)

它構建成功。 但是 (,.!) 當我嘗試運行它時,它就終止了。 所以我將libmysql.dll放在“build”目錄中,然后它運行了。 我對這些東西真的很陌生,我的這個解決方案可能並不專業。 如果你們能推薦我如何改進這個程序,或者如何設法使程序在沒有libmysql.dll文件的情況下運行,我將非常感激。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM