【问题标题】:Including libpqxx results in failed build on WSL using CMake包含 libpqxx 会导致使用 CMake 在 WSL 上构建失败
【发布时间】:2020-01-08 15:09:48
【问题描述】:

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

作为一个非常基本的测试,我有一个只包含参考的简单类:

#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 库的构建方式不匹配。如何隔离和纠正问题?

【问题讨论】:

  • "...在按照指示在类 Unix 系统上构建 libpqxx 之前,所有内容都已升级。" - 你已经建立并安装了libpqxx,不是吗?我怀疑,因为那时你告诉编译一个使用该库的示例,如果没有安装库,这是不可能的。但否则你的问题并没有声称你已经安装了libpqxx。你能否在这方面把问题发布得更清楚一点?而且,关于标题,您有 compiler 错误,而不是 linking 错误。
  • @Tsyvarev 标题已更新;但是,我不确定我是否遵循您的其余评论。GitHub 上libpqxx 的指示已正确执行,因此现在应该将其安装在系统上。但是,此应用程序是第一个使用该库的应用程序,所以在我们的构建环境中,我没有任何其他项目可以与它进行比较。
  • 我可能会错误地理解短语“......在遵循在类 Unix 系统上构建 libpqxx 的说明之前,一切都已升级。”,但对我来说,这意味着您准备好构建库的一切。 .,但不要构建它(还)。但是,如果您认为这意味着您实际上已经构建并安装了该库,那么就是这样。同样,我不要求有关安装库的其他信息。这只是一个确认请求,无论您是否安装了它。
  • @Tsyvarev 是的,库的构建和安装都很好......但是问题最终被隐藏在 CMakes 文件中,并且一旦确定就非常简单。

标签: c++ ubuntu cmake windows-subsystem-for-linux libpqxx


【解决方案1】:

虽然构建的日志有点难以解析;但是,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 must also be updated to link correctly:

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})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    相关资源
    最近更新 更多