【问题标题】:cannot use libpqxx in windows c++ application无法在 Windows C++ 应用程序中使用 libpqxx
【发布时间】:2022-11-05 20:58:44
【问题描述】:

IDE 是 VS Code,编译器工具包是 VS Community 2019 amd64。

我已经从github 下载了 pqxx 源代码。

我在控制台项目的根目录中复制了源代码树。 我使用了提供的说明建筑-cmake.md.我正在使用上述文件中提到的选项 A 将 pqxx 包含在我的项目中。因此,我在主 CMakeLists.txt 中添加了以下几行:

add_subdirectory(libpqxx build-pqxx)  #libpqxx is the directory containing pqxx source tree

target_link_libraries(myProject PRIVATE pqxx)

在此步骤之后,包含 pqxx #include <pqxx/pqxx> 的指令不会在 IDE(VS 代码)中或编译时出错。该项目构建良好并按预期运行。

当我在项目的源代码中使用以下代码时会出现问题:

pqxx::connection dbConn("user=postgres "
                            "host=192.168.1.10 "
                            "password=Abc@123 "
                            "dbname=dbName ");

如果项目源代码中存在上述代码行(即使它没有从任何地方引用),程序构建得非常好。我什至在构建过程中看到此消息pqxx.vcxproj -> D:\myProjectDirectory\build\build-pqxx\src\Debug\pqxx.lib,这表明(我认为)pqxx 库已成功构建。

但是在执行程序时,程序只是退出而没有任何消息或错误。即使我在main() 的第一行启动调试器断点,它也会失败并显示消息The program '[17572] myProject.exe' has exited with code -1073741515 (0xc0000135).

如果引用pqxx::connection 的源代码行被注释,则程序在重建后运行良好。

经过一些研究(从中我了解了对 pq.lib 的依赖),我对主 CMakeLists.txt 进行了更改,如下所示

add_subdirectory(libpqxx build-pqxx)  #libpqxx is the directory containing pqxx source tree


target_link_libraries(myProject PRIVATE pqxx
    PRIVATE "C:\\Program Files\\PostgreSQL\\14\\lib\\libpq.lib"

但是问题和以前一样。使用或不使用调试器运行时,程序退出时没有任何消息。

在构建或执行期间缺少错误消息使得无法找出问题。

请帮助我找出此设置或构建过程的问题。任何帮助将不胜感激。

编辑 1

我将 Postgres 安装目录的 binlib 子目录添加到 PATH 变量中。现在 build 命令产生了大量的语法错误等,都指向 pqxx 源代码树的 'include' 子目录中的 .hxx 文件。 (这里只发几个)

D:\projectHome\libpqxx\include\pqxx/result.hxx(135,55): error C2238: unexpected token(s) preceding ';' [D:\projectHome\build\myProject.vcxproj]
D:\projectHome\libpqxx\include\pqxx/result.hxx(136,39): error C3646: 'end': unknown override specifier [D:\projectHome\build\myProject.vcxproj]
D:\projectHome\libpqxx\include\pqxx/result.hxx(136,43): error C2059: syntax error: ')' [D:\projectHome\build\myProject.vcxproj]
D:\projectHome\libpqxx\include\pqxx/result.hxx(136,59): error C2238: unexpected token(s) preceding ';' [D:\projectHome\build\myProject.vcxproj]
D:\projectHome\libpqxx\include\pqxx/result.hxx(137,39): error C3646: 'cend': unknown override specifier [D:\projectHome\build\myProject.vcxproj]
D:\projectHome\libpqxx\include\pqxx/result.hxx(137,44): error C2059: syntax error: ')' [D:\projectHome\build\myProject.vcxproj]
D:\projectHome\libpqxx\include\pqxx/result.hxx(137,60): error C2238: unexpected token(s) preceding ';' [D:\projectHome\build\myProject.vcxproj]
D:\projectHome\libpqxx\include\pqxx/result.hxx(139,27): error C3646: 'front': unknown override specifier [D:\projectHome\build\myProject.vcxproj]
D:\projectHome\libpqxx\include\pqxx/result.hxx(139,32): error C2059: syntax error: '(' [D:\projectHome\build\myProject.vcxproj]
D:\projectHome\libpqxx\include\pqxx/result.hxx(139,49): error C2238: unexpected token(s) preceding ';' [D:\projectHome\build\myProject.vcxproj]
D:\projectHome\libpqxx\include\pqxx/result.hxx(139,49): fatal error C1003: error count exceeds 100; stopping compilation [D:\projectHome\build\myProject.vcxproj]

经过一些研究,似乎这些错误可能是由于在构建过程中缺少 c++ 标准 17。所以我在项目的主要 CMakeLists.txt 中添加了以下行。

add_subdirectory(libpqxx build-pqxx)  #libpqxx is the directory containing pqxx source tree
include_directories(libpqxx)

add_executable(myProject gmClientApi.cpp)
target_compile_features(myProject PUBLIC cxx_std_17) // new line added

target_link_libraries(myProject PRIVATE pqxx)

但仍然没有进展。现在构建因上述错误而失败。 有人知道这里可能出了什么问题吗?

【问题讨论】:

  • 错误代码0xc0000135 表示在以下位置找不到某些链接库运行.在 Windows 上,在 PATH 变量中指定的目录中搜索库。因此,请检查此变量是否包含项目中使用的所有库的路径。参见例如that answer 关于相同错误消息的问题。
  • @Tsyvarev:多亏了你,我现在遇到了很多构建错误。我将 postgres 安装目录的 binlib 目录添加到 PATH 变量中。虽然问题尚未解决,但现在至少我在构建过程中遇到了一些错误。早些时候它只是默默地失败了。
  • @Tsyvarev:从主 CMakeLists.txt 中删除 include_directories(libpqxx)(libpqxx 是 pqxx 的源树目录)后,所有错误都消失了。它又回到了它的旧行为(沉默失败)。有什么建议么?

标签: postgresql windows visual-studio-code cmake libpqxx


【解决方案1】:

感谢Tsyvarev

通过将目录添加到 PATH 系统变量,这个问题真正解决了。

对 PATH 的更改在系统重新启动后生效(通常不是这种情况)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 2011-01-29
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多