Postgresql 使用CMake安装libpq依赖项

Postgresql 使用CMake安装libpq依赖项,postgresql,cmake,libpq,Postgresql,Cmake,Libpq,我正在用Windows上的CMake构建一个程序。该程序依赖于libpq即che C PostgreSQL库 我加载PostgreSQL包,然后找到它和它构建的程序。但是我想复制libpq.dll及其对build文件夹的依赖项,以便使用它。我在编译后命令中复制了libpq.dll,但这还不够,因为它依赖于其他库 复制libpq.dll及其所需的所有文件以解决所有依赖关系的最佳方法是什么 cmake_minimum_required (VERSION 3.10) project (postgre

我正在用Windows上的CMake构建一个程序。该程序依赖于
libpq
即che C PostgreSQL库

我加载PostgreSQL包,然后找到它和它构建的程序。但是我想复制
libpq.dll
及其对build文件夹的依赖项,以便使用它。我在编译后命令中复制了
libpq.dll
,但这还不够,因为它依赖于其他库

复制
libpq.dll
及其所需的所有文件以解决所有依赖关系的最佳方法是什么

cmake_minimum_required (VERSION 3.10)

project (postgresqldatabase)
set (CMAKE_INCLUDE_CURRENT_DIR ON)

find_package (PostgreSQL REQUIRED)

set (CMAKE_INCLUDE_CURRENT_DIR ON)
include_directories (${CMAKE_SOURCE_DIR}/src ${PostgreSQL_INCLUDE_DIRS})

file (GLOB_RECURSE PROJECT_SRC *.cpp)

add_library (${PROJECT_NAME} SHARED ${PROJECT_SRC})
target_link_libraries (${PROJECT_NAME} ${PostgreSQL_LIBRARIES})

# Copy PostgreSQL .dll files on bin folder if we are on Windows
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  # It prints C:\Program Files\PostgreSQL\9.4\lib
  message (STATUS "paths are ${PostgreSQL_LIBRARY_DIRS}")
  # It prints  C:/Program Files/PostgreSQL/9.4/lib/libpq.lib
  message (STATUS "libraries are ${PostgreSQL_LIBRARIES}")
  add_custom_command (TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PostgreSQL_LIBRARY_DIRS}/libpq.dll $<TARGET_FILE_DIR:${PROJECT_NAME}>)
  # I need to copy also dll's needed to libpq.dll
endif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
cmake_最低要求(3.10版)
项目(postgresqldatabase)
设置(CMAKE\U INCLUDE\U CURRENT\U DIR ON)
查找_包(需要PostgreSQL)
设置(CMAKE\U INCLUDE\U CURRENT\U DIR ON)
include_目录(${CMAKE_SOURCE_DIR}/src${PostgreSQL_include_DIRS})
文件(全局递归项目\u SRC*.cpp)
添加库(${PROJECT\u NAME}共享${PROJECT\u SRC})
目标链接库(${PROJECT\u NAME}${PostgreSQL\u库})
#如果我们在Windows上,请复制bin文件夹中的PostgreSQL.dll文件
if(${CMAKE\u CXX\u COMPILER\u ID}”STREQUAL“MSVC”)
#它打印C:\ProgramFiles\PostgreSQL\9.4\lib
消息(状态“路径为${PostgreSQL\u LIBRARY\u DIRS}”)
#它打印C:/Program Files/PostgreSQL/9.4/lib/libpq.lib
消息(状态“库是${PostgreSQL\U库}”)
添加自定义命令(目标${PROJECT\u NAME}POST\u BUILD命令${CMAKE\u command}-E copy\u如果${PostgreSQL\u LIBRARY\u DIRS}/libpq.dll$)
#我还需要将所需的dll复制到libpq.dll
endif(${CMAKE\u CXX\u COMPILER\u ID}”STREQUAL“MSVC”)

在我的项目中,我使用一个专用的libs文件夹。我发现我需要以下DLL:

  • libeay32.dll
  • libiconv-2.dll
  • libintl-8.dll
  • libpq.dll
  • ssleay32.dll

DependencyWalker也验证了这一点,可能在一个需要更多功能的项目中,您可能需要一些其他dll,但对于基本SQL操作,这些都是设置。不确定这是否解决了您的问题,但它对我有效:

find_package(PostgreSQL REQUIRED)
include_directories (${PostgreSQL_INCLUDE_DIRS})
link_directories(${PostgreSQL_LIBRARY_DIRS})

此外,这解决了我在回答这个问题时遇到的问题,因此希望这能帮助其他人。

您还需要C:\Program Files\PostgreSQL\9.4\b下的DLL。此列表对PG版本10+仍然有效吗?我想更新HeidiSQL的库,但由于v10.2 libpq.dll的某些原因,我得到了错误126:“找不到模块”。可能有一种方法可以在这里获得更详细的错误消息(使用Delphi)?回答我自己的问题:PG 10+版本不再使用libeay32.dll和ssleay32.dll。相反,我必须添加libcrypto-1_1.dll和libssl-1_1.dll。有关更多详细信息,请参阅。