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

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

27.10.2015, 00:14. Просмотров 3390. Ответов 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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2015, 00:14
Ответы с готовыми решениями:

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

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

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

Ошибка компиляции undefined reference to `Polygon::Polygon(Point const*, int)'
#include &quot;Polygon.h&quot; #include &lt;iostream&gt; #include &lt;iomanip&gt; using std::cout; using...

Ошибка при запуске программы (undefined reference to...)
Здравствуйте, пишу лабу по С++ и столкнулся с ошибкой при запуске данного кода, ошибка...

40
DrOffset
10996 / 5867 / 1442
Регистрация: 30.01.2014
Сообщений: 9,461
27.10.2015, 09:26 21
QEM, вот этот файлик прикрепи еще: @CMakeFiles\TestSQL4.dir\linklibs.rsp
0
Kastaneda
Jesus loves me
Эксперт С++
5054 / 3072 / 351
Регистрация: 12.12.2009
Сообщений: 7,771
Записей в блоге: 2
Завершенные тесты: 1
27.10.2015, 09:26 22
Цитата Сообщение от DrOffset Посмотреть сообщение
Все работает, проблема исключительно в настройке сборки.
Тогда самый простой вариант попробовать собрать руками из командной строки.
0
QEM
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19
27.10.2015, 09:27  [ТС] 23
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\e98d4593\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\e98d4593\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\e98d4593\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\e98d4593\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\e98d4593\e98d4593\Debug C:\Users\qem-1\.clion11\system\cmake\generated\e98d4593\e98d4593\Debug C:\Users\qem-1\.clion11\system\cmake\generated\e98d4593\e98d4593\Debug\CMakeFiles\TestSQL4.dir\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
Kastaneda
27.10.2015, 09:27
  #24

Не по теме:

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

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

Содержимое linklibs.rsp:
-llibpq -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
0
DrOffset
10996 / 5867 / 1442
Регистрация: 30.01.2014
Сообщений: 9,461
27.10.2015, 09:33 27
Цитата Сообщение от QEM Посмотреть сообщение
target_link_libraries(testSQL2 libpq)
В текущем варианте замени на
target_link_libraries(testSQL2 pq)
и попробуй еще раз. Больше ничего не меняй пока.
0
QEM
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19
27.10.2015, 09:36  [ТС] 28
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
DrOffset
10996 / 5867 / 1442
Регистрация: 30.01.2014
Сообщений: 9,461
27.10.2015, 09:37 29
Цитата Сообщение от QEM Посмотреть сообщение
/lib/libpq.dll: file not recognized: File format not recognized
Ок. Вот такой финт попробуй: libpq.a, который я прислал, переименуй в libpq.dll.a и попробуй еще раз
0
QEM
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19
27.10.2015, 09:43  [ТС] 30
DrOffset, Переименовал
Ошибка та же
Перезагрузил IDE
При компиляции ошибка всё та же:
/lib/libpq.dll: file not recognized: File format not recognized
0
DrOffset
10996 / 5867 / 1442
Регистрация: 30.01.2014
Сообщений: 9,461
27.10.2015, 09:44 31
Цитата Сообщение от QEM Посмотреть сообщение
Ошибка та же
Еще разок покажи linklibs.rsp
0
QEM
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19
27.10.2015, 09:45  [ТС] 32
DrOffset, -lpq -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
0
DrOffset
10996 / 5867 / 1442
Регистрация: 30.01.2014
Сообщений: 9,461
27.10.2015, 09:57 33
QEM, так. В linklibs.rsp все правильно. Теперь вопрос такой, нет ли случайно в системе других библиотек libpq.dll, помимо той, которая лежит в lib? Действительно может быть так, что в системе где-то еще стоит libpq.dll другой разрядности, которая цепляется вместо этой.

Добавлено через 7 минут
QEM, еще в качестве эксперимента попробуй временно убрать libpq.dll из каталога lib (по идее ее там и не должно быть, в mingw обычно dll-ки в bin лежат). То есть оставь только libpq.a (обратно верни имя как было).
0
QEM
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19
27.10.2015, 10:02  [ТС] 34
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
DrOffset
10996 / 5867 / 1442
Регистрация: 30.01.2014
Сообщений: 9,461
27.10.2015, 10:05 35
Цитата Сообщение от QEM Посмотреть сообщение
Хотя.. У меня в корне C:\ лежала папка lib
Ага. Вот закинь туда libpq.a. Он похоже путь к либам не тот берет
1
QEM
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19
27.10.2015, 10:11  [ТС] 36
DrOffset, Как это ни странно, ВСЁ СКОМПИЛИРОВАЛОСЬ!!
Боже, неделя адовых мук и страданий)
Спасибо тебе огромное!

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

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

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

Ещё раз спасибо! Спас от необходимости пользоваться Visual Studio
0
DrOffset
10996 / 5867 / 1442
Регистрация: 30.01.2014
Сообщений: 9,461
27.10.2015, 10:23 39
Т.е. так:
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
QEM
0 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 19
27.10.2015, 10:25  [ТС] 40
DrOffset, В общем-то да
Да и lib на диске C оказался в результате отчаянных попыток откомпилировать программу
0
27.10.2015, 10:25
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2015, 10:25

Ошибка: undefined reference to при наследовании класса
Здравствуйте форумчане. Пытаюсь наследовать класс MyService от OAuthService и получаю множество...

Странная ошибка: [Linker error] undefined reference to `__dyn_tls_init_callback' [Linker error] undefined reference to ld returned 1 exit status
Здравствуйте. Вот недавно начал изучать книгу &quot;С++ для чайников&quot; Стефан Р. Девис 4-е издание. И...

Ошибка при сборке небольшого проекта. undefined reference to
Здравствуйте. Задача программы - подсчет сколько раз в строке встречается каждый символ. Что-то...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.