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!
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; }
作者:沐禹辰
出处:http://www.cnblogs.com/renfanzi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
出处:http://www.cnblogs.com/renfanzi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。