c++ 17 在window上安装libpqxx 结合vs2022

 

需求是按照libpqxx

版本:

c++ 17版本,我用c++20版本也测试了,ok。

libpqxx 7.7.5

postgresql是15版本

postgresql安装路径:C:\Program Files\PostgreSQL\15

先实现libpq链接postgresql,然后再实现libpqxx,libpqxx依赖于libpq,libpq的使用在下面,最后一节

1、设置环境变量

直接用powershell输入环境变量,然后关闭后在重新打开一个新的

setx PostgreSQL_LIBRARY "C:\path\to\libpq.lib"

setx PostgreSQL_INCLUDE_DIR "C:\path\to\include"

 

报错了,原因就是因为没有设置环境变量

PS C:\Usr\local\17_安装包\libpqxx-7.7.5\libpqxx-7.7.5> cmake -S C:/Usr/local/17_安装包/libpqxx-7.7.5/libpqxx-7.7.5 -B C:/Usr/local/17_安装包/libpqxx-7.7.5/libpqxx-7.7.5/build -G "Visual Studio 17 2022" -A x64
-- Selecting Windows SDK version 10.0.22000.0 to target Windows 10.0.19045.
-- The CXX compiler identification is MSVC 19.36.32532.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.36.32532/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at C:/Program Files/CMake/share/cmake-3.26/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find PostgreSQL (missing: PostgreSQL_LIBRARY
  PostgreSQL_INCLUDE_DIR)
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.26/Modules/FindPackageHandleStandardArgs.cmake:600 (_FPHSA_FAILURE_MESSAGE)
  C:/Program Files/CMake/share/cmake-3.26/Modules/FindPostgreSQL.cmake:272 (find_package_handle_standard_args)
  cmake/config.cmake:26 (find_package)
  CMakeLists.txt:27 (include)


-- Configuring incomplete, errors occurred!
View Code

 

2、cmake进行配置,记得创建build目录

模板

cmake -S /path/to/source -B /path/to/build -DCMAKE_INSTALL_PREFIX=/path/to/installation/folder -G "Visual Studio 17 2022" -A x64

/path/to/source 替换为你的源代码目录路径

/path/to/build 替换为你的构建目录路径

/path/to/installation/folder 替换为你希望安装文件的目标文件夹路径

-G "Visual Studio 16 2022" 指定生成 Visual Studio 2022 的解决方案和项目文件。

-A x64 指定生成 64 位的项目文件。

cmake -G "Visual Studio 17 2022" /
-D CMAKE_BUILD_TYPE=Release /
-S C:/Usr/local/17_安装包/libpqxx-7.7.5/libpqxx-7.7.5 /
-B C:/Usr/local/17_安装包/libpqxx-7.7.5/libpqxx-7.7.5/build /
-D CMAKE_INSTALL_PREFIX=C:/Usr/local/cxx_17/libpqxx  /
-D CMAKE_CXX_STANDARD=17 /
-A x64

 

cmake -S C:/Usr/local/17_安装包/libpqxx-7.7.5/libpqxx-7.7.5 -B C:/Usr/local/17_安装包/libpqxx-7.7.5/libpqxx-7.7.5/build -D CMAKE_INSTALL_PREFIX=C:/Usr/local/cxx_17/libpqxx -G "Visual Studio 17 2022" -A x64

 3、Build 和Install

 4、复制生成的lib和include到项目下,然后配置

 

 

5、测试代码

#include <iostream>
#include <pqxx/pqxx>

int get_data_postgre() {
    try {
        // 连接信息
        std::string conninfo = "dbname=teacher user=postgres password=xxx hostaddr=127.0.0.1 port=5432";

        // 创建连接对象
        pqxx::connection conn(conninfo);

        // 检查连接状态
        if (conn.is_open()) {
            std::cout << "连接成功!" << std::endl;

            // 创建事务对象
            pqxx::work txn(conn);

            // 执行查询语句
            pqxx::result result = txn.exec("select \"PJYWT01\", \"PJYWT02\", \"PJYWT03\", \"PJYWT04\", \"PJYWT05\", \"PJYWT06\", \"PJYWT07\", \"PJYWT08\", \"PJYWT09\" from parent_pl_20230417;");

            // 遍历结果集
            for (const auto& row : result) {
                for (const auto& field : row) {
                    std::cout << field.c_str() << " ";
                }
                std::cout << std::endl;
            }

            // 提交事务
            txn.commit();
        }
        else {
            std::cout << "连接失败!" << std::endl;
        }
    }
    catch (const std::exception& e) {
        std::cerr << "发生异常: " << e.what() << std::endl;
    }

    return 0;
}

 这时候代码报错

 

 

严重性    代码    说明    项目    文件    行    禁止显示状态
错误    LNK2019    无法解析的外部符号 __imp_ioctlsocket,函数 "public: void __cdecl pqxx::connection::set_blocking(bool)& " (?set_blocking@connection@pqxx@@QEGAAX_N@Z) 中引用了该符号    cxx_20_pqxx    C:\Opt\cxx_20_pqxx\pqxx.lib(connection.obj)    1    
严重性    代码    说明    项目    文件    行    禁止显示状态
错误    LNK2019    无法解析的外部符号 __imp_WSAGetLastError,函数 "public: void __cdecl pqxx::connection::set_blocking(bool)& " (?set_blocking@connection@pqxx@@QEGAAX_N@Z) 中引用了该符号    cxx_20_pqxx    C:\Opt\cxx_20_pqxx\pqxx.lib(connection.obj)    1    
严重性    代码    说明    项目    文件    行    禁止显示状态
错误    LNK2019    无法解析的外部符号 __imp_WSAPoll,函数 "void __cdecl pqxx::internal::wait_fd(int,bool,bool,unsigned int,unsigned int)" (?wait_fd@internal@pqxx@@YAXH_N0II@Z) 中引用了该符号    cxx_20_pqxx    C:\Opt\cxx_20_pqxx\pqxx.lib(wait.obj)    1    

解决方案:

参考了这个链接:https://blog.csdn.net/woshihuguangbao/article/details/52770136

就是将ws2_32.lib 和winmm.lib添加到链接器里面,即可。但是我没有在任何地方找到这两个lib呀,好奇怪。

 结果很ok

 

 

在window上c 使用libpq连接postgresql,怎么操作

1、安装postgresql数据库

2、vs2022上引入类库,include和lib和bin里面的dll文件

1)include

 

 

2)lib引入

 

 3)引入bin里面的dll文件到debug里面

 4)查询

#include <stdio.h>
#include <stdlib.h>
#include <libpq-fe.h>
#include <iostream>
#include <chrono>


std::chrono::high_resolution_clock::time_point start_time() {
    // 开始时间
    auto start = std::chrono::high_resolution_clock::now();
    return start;
}

std::chrono::high_resolution_clock::time_point end_time(std::chrono::high_resolution_clock::time_point start) {
    // 结束时间
    auto end = std::chrono::high_resolution_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::seconds>(end - start).count();
    std::cout << "Execution time: " << duration << " s" << std::endl;
    return end;
}

int main() {
    // 开始时间
    auto start = start_time();

    PGconn* conn;
    PGresult* res;

    // 连接到数据库
    conn = PQconnectdb("dbname=teacher user=postgres password=xxx hostaddr=127.0.0.1 port=5432");

    if (PQstatus(conn) != CONNECTION_OK) {
        fprintf(stderr, "连接到数据库失败: %s\n", PQerrorMessage(conn));
        PQfinish(conn);
        exit(1);
    }

    // 执行查询
    // res = PQexec(conn, "select \"PJYWT01\", \"PJYWT02\", \"PJYWT03\", \"PJYWT04\", \"PJYWT05\", \"PJYWT06\", \"PJYWT07\", \"PJYWT08\", \"PJYWT09\" from parent_pl_20230417;");
    res = PQexec(conn, "select \"PJYWT01\", \"PJYWT02\", \"PJYWT03\", \"PJYWT04\", \"PJYWT05\", \"PJYWT06\", \"PJYWT07\", \"PJYWT08\", \"PJYWT09\" from parent_pl_20230417;");
    if (PQresultStatus(res) != PGRES_TUPLES_OK) {
        fprintf(stderr, "查询失败: %s\n", PQerrorMessage(conn));
        PQclear(res);
        PQfinish(conn);
        exit(1);
    }

    // 处理查询结果
    int rows = PQntuples(res);
    int cols = PQnfields(res);
    int a = 0;
    for (int i = 0; i < rows; i++) {
        //for (int j = 0; j < cols; j++) {
        //    printf("%s\t", PQgetvalue(res, i, j));
        //}
        // printf("\n");
        a++;
    }

    // 释放资源
    PQclear(res);
    PQfinish(conn);

    std::cout << "a :" << a << std::endl;


    std::cout << "数据查询时间:" << std::endl;
    auto show_time = end_time(start);


    return 0;
}

 

posted @ 2023-06-30 01:52  我当道士那儿些年  阅读(1052)  评论(0编辑  收藏  举报