CMake для PostgreSQL в CLion 1.2 Windows 10

Не удалось создать файл C++ с PostgreSQL в CLion 1.2 EAP.

CMake-файл:

cmake_minimum_required(VERSION 3.3)
project(PostgreSQLTest)

find_package(PostgreSQL REQUIRED)
set(PostgreSQL_INCLUDE_DIRS, "C:\\Program Files\\PostgreSQL\\9.4\\include")
include_directories (${PostgreSQL_INCLUDE_DIRS})

set(SOURCES main.cpp)
add_executable(PostgreSQLTest ${SOURCES})
set(PostgreSQL_LIBRARIES, "C:\\Program Files\\PostgreSQL\\9.4\\lib")
target_link_libraries(PostgreSQLTest ${PostgreSQL_LIBRARIES})

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES
    CMakeLists.txt
    main.cpp)

Строить сообщения:

"C:\Program Files (x86)\JetBrains\CLion 142.4859.12\bin\cmake\bin\cmake.exe" --build C:\Users\darin\.CLion12\system\cmake\generated\f846c544\f846c544\Debug --target PostgreSQLTest -- -j 8
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/darin/.CLion12/system/cmake/generated/f846c544/f846c544/Debug
[ 50%] Linking CXX executable PostgreSQLTest.exe
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -llibpq
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [PostgreSQLTest.exe] Error 1
CMakeFiles\PostgreSQLTest.dir\build.make:96: recipe for target 'PostgreSQLTest.exe' failed
mingw32-make.exe[2]: *** [CMakeFiles/PostgreSQLTest.dir/all] Error 2
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/PostgreSQLTest.dir/all' failed
CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/PostgreSQLTest.dir/rule' failed
Makefile:117: recipe for target 'PostgreSQLTest' failed
mingw32-make.exe[1]: *** [CMakeFiles/PostgreSQLTest.dir/rule] Error 2
mingw32-make.exe: *** [PostgreSQLTest] Error 2

Есть у кого опыт с этой сборкой?

ИЗМЕНИТЬ ПОСЛЕ ПРИМЕНЕНИЯ ИЗМЕНЕНИЙ ОТ КОММЕНТАРИЯ 2015-09-21

cmake_minimum_required(VERSION 3.3)
project(PostgreSQLTest)

set(PostgreSQL_ROOT, "C:\\Program Files\\PostgreSQL\\9.4")
find_package(PostgreSQL REQUIRED)

set(SOURCES main.cpp)
add_executable(PostgreSQLTest ${SOURCES})

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES
    CMakeLists.txt
    main.cpp)

Ошибки:

"C:\Program Files (x86)\JetBrains\CLion 142.4859.12\bin\cmake\bin\cmake.exe" --build C:\Users\darin\.CLion12\system\cmake\generated\f846c544\f846c544\Debug --target PostgreSQLTest -- -j 8
[ 50%] Building CXX object CMakeFiles/PostgreSQLTest.dir/main.cpp.obj
C:\Users\darin\ClionProjects\PostgreSQLTest\main.cpp:2:22: fatal error: libpq-fe.h: No such file or directory
#include "libpq-fe.h"
                   ^
compilation terminated.
mingw32-make.exe[3]: *** [CMakeFiles/PostgreSQLTest.dir/main.cpp.obj] Error 1
CMakeFiles\PostgreSQLTest.dir\build.make:61: recipe for target 'CMakeFiles/PostgreSQLTest.dir/main.cpp.obj' failed
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/PostgreSQLTest.dir/all' failed
mingw32-make.exe[2]: *** [CMakeFiles/PostgreSQLTest.dir/all] Error 2
CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/PostgreSQLTest.dir/rule' failed
mingw32-make.exe[1]: *** [CMakeFiles/PostgreSQLTest.dir/rule] Error 2
Makefile:117: recipe for target 'PostgreSQLTest' failed
mingw32-make.exe: *** [PostgreSQLTest] Error 2

Я подтвердил, что libpq-fh.h существует в C:\Program Files\PostgreSQL\9.4\include, поэтому в моем файле Cmake должно быть что-то неправильное, что мешает сборке.

Я пропустил target_link_libraries(), который требуется для сборки?

ИЗМЕНИТЬ 2 ПОСЛЕ ПРИМЕНЕНИЯ РЕКОМЕНДУЕМЫХ ИЗМЕНЕНИЙ

cmake_minimum_required(VERSION 3.3)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

project(PostgreSQLTest)

set(PostgreSQL_ROOT "C:\\Program Files\\PostgreSQL\\9.4")
find_package(PostgreSQL REQUIRED)

set(SOURCES main.cpp)
add_executable(PostgreSQLTest ${SOURCES})

set(PostgreSQL_LIBRARIES "C:\\Program Files\\PostgreSQL\\9.4\\lib")
target_link_libraries(PostgreSQLTest ${PostgreSQL_LIBRARIES})


set(SOURCE_FILES
    CMakeLists.txt
    main.cpp)

ОШИБКИ:

"C:\Program Files (x86)\JetBrains\CLion 142.4859.12\bin\cmake\bin\cmake.exe" --build C:\Users\darin\.CLion12\system\cmake\generated\f846c544\f846c544\Debug --target all -- -j 8
[ 50%] Building CXX object CMakeFiles/PostgreSQLTest.dir/main.cpp.obj
C:\Users\darin\ClionProjects\PostgreSQLTest\main.cpp:2:22: fatal error: libpq-fe.h: No such file or directory
#include "libpq-fe.h"
                     ^
compilation terminated.
mingw32-make.exe[2]: *** [CMakeFiles/PostgreSQLTest.dir/main.cpp.obj] Error 1
mingw32-make.exe[1]: *** [CMakeFiles/PostgreSQLTest.dir/all] Error 2
mingw32-make.exe: *** [all] Error 2
CMakeFiles\PostgreSQLTest.dir\build.make:61: recipe for target 'CMakeFiles/PostgreSQLTest.dir/main.cpp.obj' failed
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/PostgreSQLTest.dir/all' failed
Makefile:82: recipe for target 'all' failed

Я внес рекомендуемые изменения, попробовал несколько разных способов компиляции, и все равно не получается.

Любые идеи?

РЕДАКТИРОВАНИЕ ПОСЛЕ КОММЕНТАРИЙ 05.10.2015

cmake_minimum_required(VERSION 3.3)
project(PostgreSQLTest)

# For *modify* CMAKE_CXX_FLAGS, this should come after project() call.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

# Next line is not required, without it given path will be checked too.
#set(PostgreSQL_ROOT "C:\\Program Files (x86)\\PostgreSQL\\9.4")
#set(PostgreSQL ROOT "C:\\MinGW\\compiledLibs\\psql\\postgresql-9.6devel\\tmp_install\\usr\\local\\pgsql")

set(PostgreSQL ROOT "C:\\MinGW\\msys\\1.0\\local\\pgsql")
find_package(PostgreSQL REQUIRED)
message("PostgreSQL_LIBRARY_DIRS: ${PostgreSQL_LIBRARY_DIRS}")

# Now variables PostgreSQL_INCLUDE_DIRS, PostgreSQL_LIBRARIES are set. Just use them.
include_directories (${PostgreSQL_INCLUDE_DIRS})
link_directories(${PostgreSQL_LIBRARY_DIRS})

set(SOURCES main.cpp)
add_executable(PostgreSQLTest ${SOURCES})
target_link_libraries(PostgreSQLTest ${PostgreSQL_LIBRARIES})

set(SOURCE_FILES
    CMakeLists.txt
    main.cpp)

Я не нахожу ничего, что указывало бы на используемую библиотеку posgres.

"C:\Program Files (x86)\JetBrains\CLion 142.4859.12\bin\cmake\bin\cmake.exe" --build C:\Users\darin\.CLion12\system\cmake\generated\f846c544\f846c544\Debug --target all -- -j 8
[ 50%] Building CXX object CMakeFiles/PostgreSQLTest.dir/main.cpp.obj
[100%] Linking CXX executable PostgreSQLTest.exe
CMakeFiles\PostgreSQLTest.dir/objects.a(main.cpp.obj): In function `Z9CloseConnP7pg_conn':
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:9: undefined reference to `PQfinish'
CMakeFiles\PostgreSQLTest.dir/objects.a(main.cpp.obj): In function `Z9ConnectDBv':
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:19: undefined reference to `PQconnectdb'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:22: undefined reference to `PQstatus'
CMakeFiles\PostgreSQLTest.dir/objects.a(main.cpp.obj): In function `Z19CreateEmployeeTableP7pg_conn':
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:39: undefined reference to `PQexec'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:41: undefined reference to `PQresultStatus'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:44: undefined reference to `PQclear'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:51: undefined reference to `PQclear'
CMakeFiles\PostgreSQLTest.dir/objects.a(main.cpp.obj): In function `Z17InsertEmployeeRecP7pg_connPKcS2_':
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:66: undefined reference to `PQexec'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:68: undefined reference to `PQresultStatus'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:71: undefined reference to `PQclear'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:78: undefined reference to `PQclear'
CMakeFiles\PostgreSQLTest.dir/objects.a(main.cpp.obj): In function `Z16FetchEmployeeRecP7pg_conn':
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:88: undefined reference to `PQexec'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:90: undefined reference to `PQresultStatus'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:93: undefined reference to `PQclear'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:98: undefined reference to `PQclear'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:101: undefined reference to `PQexec'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:102: undefined reference to `PQresultStatus'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:105: undefined reference to `PQclear'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:110: undefined reference to `PQclear'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:112: undefined reference to `PQexec'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:114: undefined reference to `PQresultStatus'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:117: undefined reference to `PQclear'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:122: undefined reference to `PQnfields'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:128: undefined reference to `PQfname'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:135: undefined reference to `PQgetvalue'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:132: undefined reference to `PQntuples'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:139: undefined reference to `PQclear'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:142: undefined reference to `PQexec'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:143: undefined reference to `PQclear'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:146: undefined reference to `PQexec'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:149: undefined reference to `PQclear'
CMakeFiles\PostgreSQLTest.dir/objects.a(main.cpp.obj): In function `Z20RemoveAllEmployeeRecP7pg_conn':
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:156: undefined reference to `PQexec'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:158: undefined reference to `PQresultStatus'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:161: undefined reference to `PQclear'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:168: undefined reference to `PQclear'
CMakeFiles\PostgreSQLTest.dir/objects.a(main.cpp.obj): In function `Z17DropEmployeeTableP7pg_conn':
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:175: undefined reference to `PQexec'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:177: undefined reference to `PQresultStatus'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:180: undefined reference to `PQclear'
C:/Users/darin/ClionProjects/PostgreSQLTest/main.cpp:187: undefined reference to `PQclear'
collect2.exe: error: ld returned 1 exit status
CMakeFiles\PostgreSQLTest.dir\build.make:96: recipe for target 'PostgreSQLTest.exe' failed
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/PostgreSQLTest.dir/all' failed
Makefile:82: recipe for target 'all' failed
mingw32-make.exe[2]: *** [PostgreSQLTest.exe] Error 1
mingw32-make.exe[1]: *** [CMakeFiles/PostgreSQLTest.dir/all] Error 2
mingw32-make.exe: *** [all] Error 2

person Darin Peterson    schedule 20.09.2015    source источник
comment
1. Если вы хотите настроить поведение find_package(), вы должны установить переменные перед. 2. Переменная PostgreSQL_LIBRARIES должна содержать список полных путей к файлам библиотек. Но вы установили его в каталог. Вместо этого вы должны установить PostgreSQL_LIBRARY_DIRS. 3. Вместо установки нескольких переменных пути для PostgreSQL лучше установить корневую переменную PostgreSQL_ROOT в C:\\Program Files\\PostgreSQL\\9.4. Опять же, это нужно сделать до find_package вызова.   -  person Tsyvarev    schedule 20.09.2015
comment
Ваш ответ был полезен, но я все еще не могу построить. Было бы полезно, если бы вы разместили свое полное решение в качестве ответа.   -  person Darin Peterson    schedule 21.09.2015
comment
Ваш первоначальный вызов target_link_libraries() был правильным, и он действительно необходим. Кроме того, вы неправильно используете , в команде set(PostgreSQL_ROOT ...): cmake использует пробел в качестве разделителя между аргументами команды. Кроме того, лучше выполнить команду set(CMAKE_CXX_FLAGS ...) перед первым вызовом add_executable().   -  person Tsyvarev    schedule 21.09.2015
comment
@Tsyvarev, по-прежнему не будет собираться с рекомендуемыми изменениями. Другие идеи?   -  person Darin Peterson    schedule 22.09.2015


Ответы (2)


Исправьте CMakeLists.txt:

cmake_minimum_required(VERSION 3.3)
project(PostgreSQLTest)

# For *modify* CMAKE_CXX_FLAGS, this should come after project() call.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

# Next line is not required, without it given path will be checked too.
set(PostgreSQL_ROOT "C:\\Program Files\\PostgreSQL\\9.4")
find_package(PostgreSQL REQUIRED)
# Now variables PostgreSQL_INCLUDE_DIRS, PostgreSQL_LIBRARIES, PostgreSQL_LIBRARY_DIRS are set. Just use them.

include_directories (${PostgreSQL_INCLUDE_DIRS})
link_directories(${PostgreSQL_LIBRARY_DIRS})

set(SOURCES main.cpp)
add_executable(PostgreSQLTest ${SOURCES})
target_link_libraries(PostgreSQLTest ${PostgreSQL_LIBRARIES})

set(SOURCE_FILES
    CMakeLists.txt
    main.cpp)

Основной (но не единственной) целью вызова find_package(PostgreSQL) является установка переменных PostgreSQL_INCLUDE_DIRS, PostgreSQL_LIBRARIES, PostgreSQL_LIBRARY_DIRS (и некоторых других). После этого не нужно устанавливать эти переменные вручную, просто используйте их.

person Tsyvarev    schedule 22.09.2015
comment
спасибо, что нашли время опубликовать это с пояснениями. Мы очень близки, но похоже, что компоновщик застрял на этом, не может найти -llibpq. Я предполагаю, что он пытается связать эту библиотеку, но я плохо знаю cmake. В C:\Program Files\PostgreSQL\9.4\lib есть несколько файлов libpq.*. Есть ли способ решить эту проблему? - person Darin Peterson; 22.09.2015
comment
Только что обнаружил, что переменная PostgreSQL_LIBRARIES - это просто libpq, а не полный путь к библиотеке. Поэтому вам нужно использовать команду link_directories (см. обновленный ответ). - person Tsyvarev; 22.09.2015
comment
Да спасибо! Это решило проблему с компоновщиком. Я считаю, что мы на последнем препятствии. Ни одна из функций PostgreSQL не распознается. Я получаю неопределенные ссылки на PQFinish, PQconnectdb, PQstatus, PQexec и т. д. Пример, который я использую, взят отсюда: askyb.com/cpp/c-postgresql-example-in-linux. - person Darin Peterson; 22.09.2015
comment
Хм, вы используете mingw для компиляции вашего проекта, поэтому сам PostgreSQL должен быть скомпилирован с использованием инструментов mingw. Поскольку путь его установки находится под C:\Program Files, кажется, это не ваш случай, не так ли? - person Tsyvarev; 22.09.2015
comment
Да, CLion использует MinGW для компиляции моего проекта. Позвольте мне немного исследовать это, и я опубликую то, что найду. У меня сейчас нет времени. Как только разберусь с этим, отпишусь. - person Darin Peterson; 23.09.2015
comment
Извините за задержку ответа @Tsyvarev. Я был в отпуске и отвлекся от этого ... Я не могу найти пакеты postgresql в MinGW, поэтому я установил 32-битную версию postgresql и указал на эти библиотеки, чтобы скомпилировать программу без успеха. Все вызовы функций postgresql по-прежнему не распознаются. - person Darin Peterson; 02.10.2015
comment
Когда вы устанавливаете PostgreSQL_ROOT для своей установки MinGW, правильно ли эта установка распознается find_package(PostgreSQL)? Проверьте (например, с помощью команды message()), что переменные PostgreSQL_LIBRARY_DIRS и PostgreSQL_INCLUDE_DIRS действительно являются точками внутри установки MinGW. - person Tsyvarev; 02.10.2015
comment
Я имею в виду размещение message("PostgreSQL_LIBRARY_DIRS: ${PostgreSQL_LIBRARY_DIRS}") где-то после вызова find_package(PostgreSQL). В этом случае строка PostgreSQL_LIBRARY_DIRS: <value> будет напечатана на этапе настройки (при выполнении cmake.exe). Путь, содержащийся в этой переменной, должен быть либо в вашей установке MinGW (если он правильно распознан CMake), либо в установке PostgreSQL по умолчанию в противном случае. - person Tsyvarev; 05.10.2015
comment
Спасибо за откровенность. См. правки в вопросе и результаты. Я не вижу ничего, что говорило бы мне, какой каталог используется. - person Darin Peterson; 07.10.2015
comment
CLion создает проект CMake в два этапа: настройка и сборка. В то время как фаза сборки выполняется каждый раз, фаза конфигурации выполняется только в первый раз и всякий раз, когда вы изменяете CMakeLists.txt файл. Например, после того, как вы добавите команду message() в CMakeLists.txt, только первая сборка CLion выполнит фазу конфигурации, которая напечатает данное сообщение. Дальнейшие сборки CLion будут пропускать этот этап, пока вы снова не измените CMakeLists.txt. - person Tsyvarev; 07.10.2015
comment
Я попытался удалить сохранение строки, вставить строку, затем сохранить, затем удалить построение сохранения строки, затем заменить сохранение и построение строки, и ни в одном из четырех раз я не видел сообщения, показывающего мне используемый каталог. Извините, не знаю, что мне здесь не хватает... - person Darin Peterson; 10.10.2015
comment
Недавно я переустановил свою систему, скомпилировал postgresql через mingw, избегая установки сервера через установщик Windows, и предоставленный файл make работает, как и ожидалось. Я не могу подключиться к серверу даже с доверием к pg_hba.conf, но это проблема конфигурации. Cmake теперь работает как положено. - person Darin Peterson; 14.11.2015

просто используйте это, проверено на Mac.

cmake_minimum_required(VERSION 3.6)
project(postgres)


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

add_custom_target(postgres COMMAND make -C ${postgres_SOURCE_DIR})

cmake done

person Jack Geller    schedule 20.04.2021