包含 libpqxx 会导致使用 CMake 在 WSL 上构建失败

Including libpqxx results in failed build on WSL using CMake

我目前正在升级使用 PostgreSQL 数据库的 C++ 应用程序。由于我们通常在基于 *nix 的系统上使用 运行,因此我目前在 Windows 子系统中工作,用于 Linux (WSL),特别是 Ubuntu 发行版。 PostgreSQL 10 是通过 apt-get 安装的,所有内容都在 following the directions to build libpqxx 之前在类 Unix 系统上升级。

作为一个非常基本的测试,我有一个简单的 class,其中仅包含参考:

#include <pqxx/pqxx> 

但是,构建会导致(长)错误日志以以下内容开头:

[ 15%] Building CXX object src/CMakeFiles/Core.dir/Reporters/DbReporter.cpp.o
In file included from /usr/local/include/pqxx/array.hxx:18:0,
                 from /usr/local/include/pqxx/array:4,
                 from /usr/local/include/pqxx/pqxx:2,
                 from /mnt/c/Users/User/git/Simulation/src/Reporters/DbReporter.cpp:3:
/usr/local/include/pqxx/internal/encodings.hxx:26:42: error: ‘pqxx::internal::encoding_group pqxx::internal::enc_group’ redeclared as different kind of symbol
 encoding_group enc_group(std::string_view);

随后的所有错误都与 /pqxx/*. 下生成错误的文件具有相似的性质。通常用于无效声明、不属于 std 命名空间(未在应用程序中重新定义)的函数,或者似乎是语法错误。

我怀疑 libpqxx 库的构建方式不匹配。我如何找出并纠正问题?

虽然构建日志有点难以解析;然而,行 redeclared as different kind of symbol 是一个线索,输出中有错误,例如:

/usr/local/include/pqxx/stream_from.hxx: In constructor ‘pqxx::stream_from::stream_from(pqxx::transaction_base&, const string&, Iter, Iter ’:
/usr/local/include/pqxx/stream_from.hxx:134:19: error: missing template arguments before ‘(’ token
     separated_list(",", columns_begin, columns_end)

这些强烈暗示代码中存在语法错误,尽管使用开发人员概述的工具链可以很好地构建库。重要的一点是 libpqxx 依赖于 C++17。错误最终出现在 CMakeLists.txt 文件中:

set(CMAKE_CXX_STANDARD 14)

表明尽管库依赖于 C++17,但应用程序是使用 C++14 构建的。 17 的更新行更正了问题并允许构建代码。此时CMakeLists.txt:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lpqxx -lpq")
set(PQXX /usr/local/include/pqxx)

find_library(PQXX_LIB pqxx)
find_library(PQ_LIB pq)

target_link_libraries(PROGRAM ${PQXX_LIB} ${PQ_LIB})