使用CMake构建libpqxx C++程序时链接器报错
CMake链接libpqxx失败,但手动编译正常的解决方法
问题概述
使用CMake构建基于libpqxx的C程序时,Linux和macOS均出现链接器错误,无法找到pqxx相关的C符号。但find_package(PostgreSQL)能正常识别libpq(C语言库),且通过clang++ main.cpp -o main -lpqxx -lpq命令可成功编译运行,证明libpqxx和libpq已正确安装。
macOS下Ninja编译错误输出
[2/2] Linking CXX executable main FAILED: main : && /Library/Developer/CommandLineTools/usr/bin/c++ -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX13.1.sdk -mmacosx-version-min=12.6 -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/main.dir/src/main.cpp.o -o main /usr/local/lib/libpq.dylib && : Undefined symbols for architecture x86_64: "pqxx::connection::init(char const*)", referenced from: pqxx::connection::connection(char const*) in main.cpp.o "pqxx::connection::close()", referenced from: pqxx::connection::~connection() in main.cpp.o "pqxx::internal::demangle_type_name(char const*)", referenced from: ___cxx_global_var_init in main.cpp.o ___cxx_global_var_init.2 in main.cpp.o ___cxx_global_var_init.3 in main.cpp.o ___cxx_global_var_init.4 in main.cpp.o "pqxx::internal::check_pqxx_version_7_8()", referenced from: pqxx::check_version() in main.cpp.o "pqxx::connection::dbname() const", referenced from: _main in main.cpp.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) ninja: build stopped: subcommand failed.
现有配置文件
CMakeLists.txt
cmake_minimum_required(VERSION 3.25) project(main VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(PROJECT_SOURCES src/main.cpp) add_executable(main ${PROJECT_SOURCES}) find_package(PostgreSQL REQUIRED) target_link_libraries(main PRIVATE PostgreSQL::PostgreSQL)
main.cpp
#include <iostream> #include <pqxx/pqxx> int main(int argc, const char *argv[]) { pqxx::connection c; std::cout << "Connected to " << c.dbname() << ".\n"; return 0; }
可正常工作的C语言版本(main.c)
#include <stdio.h> #include <libpq-fe.h> int main(int argc, const char *argv[]) { int lib_ver = PQlibVersion(); printf("Version of libpq: %d\n", lib_ver); return 0; }
环境信息
- Intel架构Mac,macOS 12.6.8,通过Homebrew安装PostgreSQL、libpq、libpqxx
- Ubuntu 22.04,通过apt安装PostgreSQL、libpq-dev,libpqxx源码编译后安装至/usr/local
解决方案
问题核心:原CMake配置仅链接了libpq(PostgreSQL的C语言库),但未链接libpqxx这个独立的C++库。手动编译时通过-lpqxx指定了该库,因此CMake需要显式添加对libpqxx的链接。
方案1:使用libpqxx的CMake配置文件(推荐)
如果libpqxx安装时提供了CMake配置模块(如Homebrew安装的版本),修改CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.25) project(main VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(PROJECT_SOURCES src/main.cpp) add_executable(main ${PROJECT_SOURCES}) find_package(PostgreSQL REQUIRED) # 查找libpqxx的CMake配置 find_package(PQXX REQUIRED) # 同时链接libpq和libpqxx target_link_libraries(main PRIVATE PostgreSQL::PostgreSQL PQXX::PQXX)
方案2:手动查找libpqxx库(适用于无CMake配置的源码安装版本)
如果libpqxx没有提供CMake配置文件,通过find_library和find_path手动定位库和头文件:
cmake_minimum_required(VERSION 3.25) project(main VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(PROJECT_SOURCES src/main.cpp) add_executable(main ${PROJECT_SOURCES}) find_package(PostgreSQL REQUIRED) # 手动查找libpqxx库和头文件 find_library(PQXX_LIBRARY pqxx REQUIRED) find_path(PQXX_INCLUDE_DIR pqxx/pqxx.h REQUIRED) # 添加头文件路径 target_include_directories(main PRIVATE ${PQXX_INCLUDE_DIR}) # 链接libpq和libpqxx target_link_libraries(main PRIVATE PostgreSQL::PostgreSQL ${PQXX_LIBRARY})
内容的提问来源于stack exchange,提问作者Mehrshad Khansarian
相关产品推荐
相关产品推荐

