Windows下libpqxx(PostgreSQL)链接错误排查求助
问题描述
通过vcpkg将libpqxx(pqxx)添加到CMake项目后,构建时出现链接错误。
现有CMake代码
find_package(libpqxx CONFIG REQUIRED) target_link_libraries(PqDataBase PRIVATE libpqxx::pqxx)
头文件引入
#include <pqxx/pqxx>
错误信息
D:\PqDataBase>cmake --build .\build [2/2] Linking CXX executable PqDataBase.exe FAILED: PqDataBase.exe C:\windows\system32\cmd.exe /C "cd . && C:\msys64\ucrt64\bin\c++.exe CMakeFiles/PqDataBase.dir/PqDataBase.cpp.obj -o PqDataBase.exe -Wl,--out-implib,libPqDataBase.dll.a -Wl,--major-image-version,0,--minor-image-version,0 C:/vcpkg/installed/x64-windows/debug/lib/pqxx.lib -lwsock32 -lws2_32 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && C:\windows\system32\cmd.exe /C "cd /D D:\PqDataBase\build && C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -executionpolicy Bypass -file C:/vcpkg/scripts/buildsystems/msbuild/applocal.ps1 -targetBinary D:/PqDataBase/build/PqDataBase.exe -installedDir C:/vcpkg/installed/x64-windows/bin -OutVariable out" C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/PqDataBase.dir/PqDataBase.cpp.obj:PqDataBase.cpp:(.text+0x1bd): undefined reference to `__imp__ZN4pqxx14argument_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE' C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/PqDataBase.dir/PqDataBase.cpp.obj:PqDataBase.cpp:(.text+0x311): undefined reference to `__imp__ZN4pqxx8internal18demangle_type_nameB5cxx11EPKc' C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/PqDataBase.dir/PqDataBase.cpp.obj:PqDataBase.cpp:(.text+0x345): undefined reference to `__imp__ZN4pqxx8internal18demangle_type_nameB5cxx11EPKc' C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/PqDataBase.dir/PqDataBase.cpp.obj:PqDataBase.cpp:(.text+0x379): undefined reference to `__imp__ZN4pqxx8internal18demangle_type_nameB5cxx11EPKc' C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/PqDataBase.dir/PqDataBase.cpp.obj:PqDataBase.cpp:(.text+0x3ad): undefined reference to `__imp__ZN4pqxx8internal18demangle_type_nameB5cxx11EPKc' C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/PqDataBase.dir/PqDataBase.cpp.obj:PqDataBase.cpp:(.text$_ZN4pqxx14argument_errorD1Ev[_ZN4pqxx14argument_errorD1Ev]+0xf): undefined reference to `__imp__ZTVN4pqxx14argument_errorE' collect2.exe: error: ld returned 1 exit status ninja: build stopped: subcommand failed.
解决方案
1. 安装适配MinGW的libpqxx版本
错误显示你用MinGW编译器链接了MSVC版本的libpqxx库(x64-windows),两者不兼容。执行以下命令重新安装MinGW适配的动态库版本:
vcpkg install libpqxx:x64-mingw-dynamic
2. 指定vcpkg工具链文件配置CMake
配置CMake时必须明确指定vcpkg的工具链文件,确保找到正确的库:
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-mingw-dynamic
3. 完善CMake链接配置
若仍有问题,尝试显式链接PostgreSQL基础库:
find_package(libpqxx CONFIG REQUIRED) find_package(PostgreSQL REQUIRED) target_link_libraries(PqDataBase PRIVATE libpqxx::pqxx PostgreSQL::PostgreSQL)
4. 确保动态库可被找到
构建完成后,将C:/vcpkg/installed/x64-mingw-dynamic/bin下的pqxx.dll复制到可执行文件所在目录,或把该路径添加到系统环境变量PATH中。
内容的提问来源于stack exchange,提问作者muhammed_h
相关产品推荐
相关产品推荐

