FindPostgreSQL.cmake won't work on ubuntu

匿名 (未验证) 提交于 2019-12-03 03:10:03

问题:

  • Ubuntu 12.04
  • CMake 2.8.9
  • Postgresql 9.2.2

I'm trying to get the FindPostgreSQL module to find /usr/include/postgresql/libpq-fe.h.

Here's what I have in my CMakeLists.txt:

find_package(PostgreSQL REQUIRED) 

This is the error I get:

CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (MESSAGE):   Could NOT find PostgreSQL (missing: PostgreSQL_TYPE_INCLUDE_DIR) (found   version "9.2.2") Call Stack (most recent call first):   /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:288 (_FPHSA_FAILURE_MESSAGE)   /usr/share/cmake-2.8/Modules/FindPostgreSQL.cmake:155 (find_package_handle_standard_args)   CMakeLists.txt:7 (find_package) 

I added the following lines before calling find_package but it didn't seem to have any effect.

set(PostgreSQL_ADDITIONAL_VERSIONS "9.2.2") set(PostgreSQL_ADDITIONAL_SEARCH_PATHS ${PostgreSQL_ADDITIONAL_SEARCH_PATHS} "/usr/include/postgresql") 

I also tried googling for PostgreSQL_TYPE_INCLUDE_DIR but didn't find anything. What else can I try?

回答1:

Make sure you've installed both libpq-dev\ and postgresql-server-dev-all (or specific version e.g. postgresql-server-dev-9.4)

$ dpkg --get-selections | grep -e "libpq-dev\|postgresql-server-dev" 

in case you're missing some package

apt-get install libpq-dev postgresql-server-dev-all 

should fix it.



回答2:

After a bit more debugging I figured out that it's getting stuck trying to find pg_type.h

This file is located in /usr/include/postgresql/catalog/pg_types.h but the module is expecting to find it in /usr/include/postgresql/server/catalog/pg_types.h

find_path(PostgreSQL_TYPE_INCLUDE_DIR   NAMES catalog/pg_type.h   PATHS    # Look in other places.    ${PostgreSQL_ROOT_DIRECTORIES}   PATH_SUFFIXES     pgsql/server     postgresql/server     include/server   # Help the user find it if we cannot.   DOC "The ${PostgreSQL_INCLUDE_DIR_MESSAGE}" ) 

It works if I add postgresql to the PATH_SUFFIXES

find_path(PostgreSQL_TYPE_INCLUDE_DIR   NAMES catalog/pg_type.h   PATHS    # Look in other places.    ${PostgreSQL_ROOT_DIRECTORIES}   PATH_SUFFIXES     postgresql     pgsql/server     postgresql/server     include/server   # Help the user find it if we cannot.   DOC "The ${PostgreSQL_INCLUDE_DIR_MESSAGE}" ) 


回答3:

On Ubuntu you can also work around that issue by calling cmake with having PostgreSQL_TYPE_INCLUDE_DIR defined like this:

cmake -DPostgreSQL_TYPE_INCLUDE_DIR=/usr/include/postgresql/ 

On Ubuntu/Debian, starting with PostgreSQL 9.3 the header file pg_type.h is moved to a separate package (from libpq-dev to postgresql-server-dev) and consequently the file pg_type.h is moved to a new location



回答4:

From Linux Mint 17.3 ("Rosa") with PostgreSQL 9.3, I had to adjust ilia choly's solution (interestingly, the suggested postgres entry in the list was already present in the file, but wasn't enough to fix things).

I had to edit /usr/share/cmake-2.8/Modules/FindPostgreSQL.cmake around line 114 and add postgresql/9.3 so that the find_path call looks like

find_path(PostgreSQL_TYPE_INCLUDE_DIR   NAMES catalog/pg_type.h   PATHS    # Look in other places.    ${PostgreSQL_ROOT_DIRECTORIES}   PATH_SUFFIXES     postgresql/9.3     postgresql     pgsql/server     postgresql/server     include/server   # Help the user find it if we cannot.   DOC "The ${PostgreSQL_INCLUDE_DIR_MESSAGE}" ) 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!