Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.79/56: Рейтинг темы: голосов - 56, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19

PostgreSQL и CLion, ошибка при компиляции undefined reference

27.10.2015, 00:14. Показов 11985. Ответов 40

Господа знатоки, который день мучаюсь с одной проблемой
Изучаю PostgreSQL. Возникла потребность в управлении базой через C++. Узнал, что есть библиотека libpq специально для этих целей. Она стандартная для postgres'а и лежит в его корневой папке.
Проблема возникла при подключении этой библиотеки. Дело в том, что я пишу в CLion 1.1.1, который, в свою очередь, использует CMake.
Стало быть, чтобы подключить постгрес я должен прописать команды подключения в makefile'е.
У CMake есть стандартное средство для поиска Postgres'а и его библиотек. Мне остаётся лишь вызвать это средство.
Поддержка JetBrains "помогла" мне в этом вопросе и выяснилось, что makefile в самом простом случае должен выглядеть так:

cmake_minimum_required(VERSION 3.3)
project(testSQL2)

find_package(PostgreSQL REQUIRED)
include_directories (${PostgreSQL_INCLUDE_DIR})

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

target_link_libraries(testSQL2 libpq)

Собственно, я создал тестовый проект, где файл так и выглядит.

Вот, что содержит main.cpp:
C++
1
2
3
4
5
6
7
#include <libpq-fe.h>
 
int main() {
    const char * a = "Sample";
    PQconnectdb(a);
    return 0;
}
IDE видит процедуры работы с Postgres. И даже подсказывает при наборе. Но на этапе компиляции я получаю ошибку:
C:/Users/qem-1/ClionProjects/testSQL2/main.cpp:5: undefined reference to `PQconnectdb'

Как будто он не видит самую реализацию функции

Примечательно также то, что во вкладке Cache CMake'а я вижу абсолютно правильно определённые директории расположения Postgres'а:
PostgreSQL_INCLUDE_DIR C:/PostgreSQL/include
PostgreSQL_LIBRARY C:/PostgreSQL/lib
PostgreSQL_TYPE_INCLUDE_DIR C:/PostgreSQL/include/server

Тех.поддержка JetBrains разводит руками и, вроде как, не сможет мне помочь.
Так что же всё таки надо сделать, чтобы скомпилировать такой проект и начать работать?

Windows 10 x64, CLion 1.1.1, MinGW 3.21, PostgreSQL 9.4
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.10.2015, 00:14
Ответы с готовыми решениями:

Ошибка при компиляции undefined reference to `List<int>::List()'|
Доброго времени суток=) столкнулась с такой проблемой нужно написать шаблон класса. При компиляции выдает ошибку undefined reference to...

Ошибка компиляции единого файла: undefined reference to `vtable for .'
Проблема при компиляции файла: prog.cpp:(.text.startup+0x42): undefined reference to `vtable for Man' prog.cpp:(.text.startup+0x64):...

При компиляции Dev-C ошибки: undefined reference to
Привествую. Подозреваю что что то не до объявил. Код: #include &lt;iostream&gt; using namespace std; int main() { ...

40
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
27.10.2015, 09:26
QEM, вот этот файлик прикрепи еще: @CMakeFiles\TestSQL4.dir\linklibs.rsp
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
27.10.2015, 09:26
Цитата Сообщение от DrOffset Посмотреть сообщение
Все работает, проблема исключительно в настройке сборки.
Тогда самый простой вариант попробовать собрать руками из командной строки.
0
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19
27.10.2015, 09:27  [ТС]
DrOffset, Содержимое Cmakelists:
set(CMAKE_VERBOSE_MAKEFILE true)
cmake_minimum_required(VERSION 3.3)
project(TestSQL4)

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

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


Лог компиляции:

C:\CLion_1.1.1\bin\cmake\bin\cmake.exe --build C:\Users\qem-1\.clion11\system\cmake\generated\e98d45 93\e98d4593\Debug --target TestSQL4 -- -j 4
C:\CLion_1.1.1\bin\cmake\bin\cmake.exe -HC:\Users\qem-1\ClionProjects\TestSQL4 -BC:\Users\qem-1\.clion11\system\cmake\generated\e98d45 93\e98d4593\Debug --check-build-system CMakeFiles\Makefile.cmake 0
C:/MinGW/bin/mingw32-make.exe -f CMakeFiles\Makefile2 TestSQL4
mingw32-make.exe[1]: Entering directory 'C:/Users/qem-1/.clion11/system/cmake/generated/e98d4593/e98d4593/Debug'
C:\CLion_1.1.1\bin\cmake\bin\cmake.exe -HC:\Users\qem-1\ClionProjects\TestSQL4 -BC:\Users\qem-1\.clion11\system\cmake\generated\e98d45 93\e98d4593\Debug --check-build-system CMakeFiles\Makefile.cmake 0
C:\CLion_1.1.1\bin\cmake\bin\cmake.exe -E cmake_progress_start C:\Users\qem-1\.clion11\system\cmake\generated\e98d45 93\e98d4593\Debug\CMakeFiles 2
C:/MinGW/bin/mingw32-make.exe -f CMakeFiles\Makefile2 CMakeFiles/TestSQL4.dir/all
mingw32-make.exe[2]: Entering directory 'C:/Users/qem-1/.clion11/system/cmake/generated/e98d4593/e98d4593/Debug'
C:/MinGW/bin/mingw32-make.exe -f CMakeFiles\TestSQL4.dir\build.make CMakeFiles/TestSQL4.dir/depend
mingw32-make.exe[3]: Entering directory 'C:/Users/qem-1/.clion11/system/cmake/generated/e98d4593/e98d4593/Debug'
C:\CLion_1.1.1\bin\cmake\bin\cmake.exe -E cmake_depends "MinGW Makefiles" C:\Users\qem-1\ClionProjects\TestSQL4 C:\Users\qem-1\ClionProjects\TestSQL4 C:\Users\qem-1\.clion11\system\cmake\generated\e98d45 93\e98d4593\Debug C:\Users\qem-1\.clion11\system\cmake\generated\e98d45 93\e98d4593\Debug C:\Users\qem-1\.clion11\system\cmake\generated\e98d45 93\e98d4593\Debug\CMakeFiles\TestSQL4.di r\DependInfo.cmake --color=
mingw32-make.exe[3]: Leaving directory 'C:/Users/qem-1/.clion11/system/cmake/generated/e98d4593/e98d4593/Debug'
C:/MinGW/bin/mingw32-make.exe -f CMakeFiles\TestSQL4.dir\build.make CMakeFiles/TestSQL4.dir/build
mingw32-make.exe[3]: Entering directory 'C:/Users/qem-1/.clion11/system/cmake/generated/e98d4593/e98d4593/Debug'
[ 50%] Linking CXX executable TestSQL4.exe
C:\CLion_1.1.1\bin\cmake\bin\cmake.exe -E cmake_link_script CMakeFiles\TestSQL4.dir\link.txt --verbose=1
C:\CLion_1.1.1\bin\cmake\bin\cmake.exe -E remove -f CMakeFiles\TestSQL4.dir/objects.a
C:\MinGW\bin\ar.exe cr CMakeFiles\TestSQL4.dir/objects.a @CMakeFiles\TestSQL4.dir\objects1.rsp
C:\MinGW\bin\g++.exe -g -Wl,--whole-archive CMakeFiles\TestSQL4.dir/objects.a -Wl,--no-whole-archive -o TestSQL4.exe -Wl,--out-implib,libTestSQL4.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles\TestSQL4.dir\linklibs.rsp
CMakeFiles\TestSQL4.dir/objects.a(main.cpp.obj): In function `main':
C:/Users/qem-1/ClionProjects/TestSQL4/main.cpp:5: undefined reference to `PQconnectdb'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [TestSQL4.exe] Error 1
CMakeFiles\TestSQL4.dir\build.make:99: recipe for target 'TestSQL4.exe' failed
mingw32-make.exe[3]: Leaving directory 'C:/Users/qem-1/.clion11/system/cmake/generated/e98d4593/e98d4593/Debug'
CMakeFiles\Makefile2:69: recipe for target 'CMakeFiles/TestSQL4.dir/all' failed
mingw32-make.exe[2]: Leaving directory 'C:/Users/qem-1/.clion11/system/cmake/generated/e98d4593/e98d4593/Debug'
CMakeFiles\Makefile2:81: recipe for target 'CMakeFiles/TestSQL4.dir/rule' failed
mingw32-make.exe[1]: Leaving directory 'C:/Users/qem-1/.clion11/system/cmake/generated/e98d4593/e98d4593/Debug'
mingw32-make.exe[2]: *** [CMakeFiles/TestSQL4.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles/TestSQL4.dir/rule] Error 2
mingw32-make.exe: *** [TestSQL4] Error 2
Makefile:120: recipe for target 'TestSQL4' failed
0
27.10.2015, 09:27

Не по теме:

Цитата Сообщение от QEM Посмотреть сообщение
Kastaneda, Не уверен, что я правильно вас понял
Я удалил уже это, это под OSX, скопипастил с SO неглядя :)

0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
27.10.2015, 09:28
QEM, не надо собирать x64. Проблема не в этом.
Должен быть первоначальный вариант CmakeLists с добавлением verbose. Удаленный (перемещенный) libpq.lib из каталога (должен остаться только libpq.a и libpq.dll).
И содержимое файла @CMakeFiles\TestSQL4.dir\linklibs.rsp прикрепи.
0
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19
27.10.2015, 09:31  [ТС]
DrOffset, Да, libpq.lib удалён. Cmakelists изменён, как ты и говорил. Вариант первоначальный с добавлением в начало строчки

Содержимое linklibs.rsp:
-llibpq -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
27.10.2015, 09:33
Цитата Сообщение от QEM Посмотреть сообщение
target_link_libraries(testSQL2 libpq)
В текущем варианте замени на
target_link_libraries(testSQL2 pq)
и попробуй еще раз. Больше ничего не меняй пока.
0
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19
27.10.2015, 09:36  [ТС]
DrOffset, Cmakelists:
set(CMAKE_VERBOSE_MAKEFILE true)
cmake_minimum_required(VERSION 3.3)
project(TestSQL4)

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

set(SOURCES main.cpp)
add_executable(TestSQL4 ${SOURCES})
target_link_libraries(TestSQL4 pq)

ОШибка:
/lib/libpq.dll: file not recognized: File format not recognized
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
27.10.2015, 09:37
Цитата Сообщение от QEM Посмотреть сообщение
/lib/libpq.dll: file not recognized: File format not recognized
Ок. Вот такой финт попробуй: libpq.a, который я прислал, переименуй в libpq.dll.a и попробуй еще раз
0
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19
27.10.2015, 09:43  [ТС]
DrOffset, Переименовал
Ошибка та же
Перезагрузил IDE
При компиляции ошибка всё та же:
/lib/libpq.dll: file not recognized: File format not recognized
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
27.10.2015, 09:44
Цитата Сообщение от QEM Посмотреть сообщение
Ошибка та же
Еще разок покажи linklibs.rsp
0
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19
27.10.2015, 09:45  [ТС]
DrOffset, -lpq -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
27.10.2015, 09:57
QEM, так. В linklibs.rsp все правильно. Теперь вопрос такой, нет ли случайно в системе других библиотек libpq.dll, помимо той, которая лежит в lib? Действительно может быть так, что в системе где-то еще стоит libpq.dll другой разрядности, которая цепляется вместо этой.

Добавлено через 7 минут
QEM, еще в качестве эксперимента попробуй временно убрать libpq.dll из каталога lib (по идее ее там и не должно быть, в mingw обычно dll-ки в bin лежат). То есть оставь только libpq.a (обратно верни имя как было).
0
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19
27.10.2015, 10:02  [ТС]
DrOffset, Насколько я знаю - нет
Откуда им взяться..
Эта библиотека берётся из папки Postgres'а
Дело в том, что я ничего ниоткуда больше не качал
И на всякий случай переустанавливал и постгрес и Clion

Хотя.. У меня в корне C:\ лежала папка lib
Со всеми либами постгреса. Это те же самые библиотеки, просто выдернуты из папки постгреса и перенесены в корень C:\
Сейчас удалил её и при компиляции вижу такое:
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lpq

Также удалил libpq.dll из lib, имя также изменил на libpq.a
Ошибка при компиляции:
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lpq
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
27.10.2015, 10:05
Цитата Сообщение от QEM Посмотреть сообщение
Хотя.. У меня в корне C:\ лежала папка lib
Ага. Вот закинь туда libpq.a. Он похоже путь к либам не тот берет
1
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19
27.10.2015, 10:11  [ТС]
DrOffset, Как это ни странно, ВСЁ СКОМПИЛИРОВАЛОСЬ!!
Боже, неделя адовых мук и страданий)
Спасибо тебе огромное!

Осталось только понять, какого дьявола путь в либам он берёт именно оттуда. Но уже и с этим костылём работать можно)

Добавлено через 2 минуты
DrOffset, Кстати, в папке C:\lib
Сейчас лежит только libpq.a файл
Ему его достаточно для работы?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
27.10.2015, 10:15
Цитата Сообщение от QEM Посмотреть сообщение
Осталось только понять, какого дьявола путь в либам он берёт именно оттуда. Но уже и с этим костылём работать можно)
Попробуй указывать правильный путь через LINK_DIRECTORIES( путь ) в CmakeLists
Цитата Сообщение от QEM Посмотреть сообщение
Как это ни странно, ВСЁ СКОМПИЛИРОВАЛОСЬ!!
Это как раз не странно. Это нормально. Библиотека импорта совместно с присланной тобой dll была вчера мной проверена, поэтом 100% проблема была в порядке сборки

Добавлено через 45 секунд
Цитата Сообщение от QEM Посмотреть сообщение
Ему его достаточно для работы?
Для компиляции - достаточно.
Для выполнения рядом с exe (или где-то в общедоступном системном пути) должна быть libpq.dll.
0
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19
27.10.2015, 10:20  [ТС]
DrOffset, удалил lib из C:\
В Cmakelists прописал:
LINK_DIRECTORIES("C:/Program Files/PostgreSQL/9.4/lib")
Всё отлично
Что ж они в службе поддержки не догадались..

Ещё раз спасибо! Спас от необходимости пользоваться Visual Studio
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
27.10.2015, 10:23
Т.е. так:
set(CMAKE_VERBOSE_MAKEFILE true)
cmake_minimum_required(VERSION 3.3)
project(TestSQL4)

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

set(SOURCES main.cpp)
add_executable(TestSQL4 ${SOURCES})
target_link_libraries(TestSQL4 pq)
В папке PostgreSQL_LIBRARY - должен быь libpq.a (libpq.dll тоже можно оставить).
Инклуды - как обычно в PostgreSQL_INCLUDE_DIRS
Так должно работать без всяких костылей.

Добавлено через 2 минуты
Цитата Сообщение от QEM Посмотреть сообщение
Что ж они в службе поддержки не догадались..
Видишь ли, мы тут на 2 страницы гадали. У меня вот, например, нет ни CLion, ни cmake ни вообще windows в данный момент. Техподдержка просто не стала морочиться с этим, т.к. сложно угадывать проблему по косввенным признакам. Если бы ты не сказал про lib на диске C, то неизвестно сколько бы мы еще мучились.
0
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19
27.10.2015, 10:25  [ТС]
DrOffset, В общем-то да
Да и lib на диске C оказался в результате отчаянных попыток откомпилировать программу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.10.2015, 10:25

Ошибка при компиляции. undefined reference
вот часть кода как я понимаю не нравиться компилятору выдает эти ошибки: ...

LittleCMS при компиляции ошибка undefined reference to `cmsOpenProfileFromFile'
Друзья, добрый день. Изучаю азы языка Си, пробую использовать стороннюю библиотеку (Little CMS - модуль управление цветом:...

qt 5.2 ошибка компиляции undefined reference to
Пишу в QT Creator 5.2 класс для создания пользовательского слота и возникает ошибка: подскажите, пожалуйста, в чем может быть причина:...

Ошибка компиляции (undefined reference)
Здравствуйте! Есть класс enemy.h #ifndef ENEMY_H #define ENEMY_H #include &lt;cstdlib&gt; #include &lt;time.h&gt;

Ошибка компиляции Undefined reference to
Здравствуйте! Прохожу Структуры со ссылками на себя. В примере была указана программа бинарного дерева. При компиляции кода ошибка:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru