Простая программа на C++ с использованием pqxx (postgres)

Я пробую очень простую программу на С++, используя Code::Blocks. Я на Ubuntu 12.04 и установил pqxx из диспетчера программного обеспечения. Вот код.

#include <pqxx/pqxx>
#include <iostream>

using namespace std;
int main()
{

    pqxx::connection MyConn ("dbname=dbESM user=postgres");


    cout << "Hello world!" << endl;

    return 0;
}

Но я получаю следующую ошибку при нажатии F9 для компиляции и запуска:

/usr/include/pqxx/connection.hxx|87|неопределенная ссылка на `pqxx::connectionpolicy::connectionpolicy(std::basic_string, std::allocator > const&)'

Приведенное выше сообщение взято из файла connection.hxx, и выделена следующая строка:

  explicit connect_direct(const PGSTD::string &opts) : connectionpolicy(opts) {}

Файл connection.hxx не мой - я думаю, что это часть pqxx.

Я новичок в этой платформе, поэтому я избегаю терминала для компиляции кода. Любая помощь будет принята с благодарностью.


person itsols    schedule 30.06.2013    source источник
comment
FWIW Я видел отчеты, в которых говорилось, что libpqxx особо не поддерживается. Лично я бы использовал обычные libpq и libpqtypes.   -  person Craig Ringer    schedule 30.06.2013
comment
@CraigRinger Спасибо за совет. Я новичок в этой платформе, и я понял, что pqxx используется по умолчанию. Кроме того, я думал, что libpq больше похож на старый код в стиле C. Я не гуру здесь, но я просто делюсь своими мыслями. В конце концов, я рассматриваю возможность создания приложений wxwidgets с использованием Code::Clocks в качестве IDE. Поэтому я думаю, будет ли удобно использовать libpq, когда дело доходит до таких вещей, как сетки в форме. Пожалуйста посоветуй. Спасибо!   -  person itsols    schedule 30.06.2013
comment
libpq действительно является чистой библиотекой C. Это означает, что требуется немного больше работы для управления ресурсами и обработки ошибок, поскольку нет исключений, нет RAII и нет автоматических dtors. OTOH, вы можете использовать libpqtypes, который может многое упростить. Не уверен, что это работает с libpqxx.   -  person Craig Ringer    schedule 01.07.2013


Ответы (2)


Вам нужно добавить в проект ссылку на библиотеку libpqxx.

Внутри Code::blocks, когда проект открыт, найдите Project в меню, затем следуйте Build options, затем откройте вкладку под названием Linker settings, затем нажмите Add, затем введите pqxx.

Если бы вместо этого вы использовали библиотеку libpq C, процедура была бы идентичной, за исключением того, что имя было бы pq.

person Daniel Vérité    schedule 30.06.2013
comment
Извините, если это звучит довольно глупо. Но почему бы нам не указать путь к libpqxx? Проще говоря, libpqxx работает. Как так? - person itsols; 01.07.2013
comment
@itsols: потому что он находится в стандартном месте (/usr/lib), где компоновщик смотрит по умолчанию - person Daniel Vérité; 01.07.2013

Вам нужно связать с соответствующей библиотекой, просто #включая заголовочные файлы недостаточно. Если доступно, вы можете использовать pkg-config для определения соответствующих библиотек. Далее, какую IDE вы используете? Без этого ссылка «при нажатии F9» бесполезна. Кроме того, скомпилировать это в командной строке может быть даже проще, так как понятнее, что именно происходит.

person Ulrich Eckhardt    schedule 30.06.2013
comment
Спасибо за ваше время. Я использую Code::Blocks в качестве IDE. Пожалуйста, уточните, что вы подразумеваете под ссылкой на соответствующие библиотеки... Я просто следил за документацией на сайте pqxx. Я думал, что Code::Blocks позаботится о большинстве ссылок... - person itsols; 30.06.2013
comment
Как объяснил Даниэль выше, C::B не заботится о компоновке автоматически. В Debian libpqxx3-dev поставляется с интеграцией pkg-config, поэтому необходимые настройки для компиляции и компоновки можно получить через pkg-config libpqxx --cflags и pkg-config libpqxx --libs. Я бы использовал их вместо жесткого кодирования, потому что это будет работать, даже если вы установите другую версию локально, где вам понадобятся пути /usr/local/... Если это работает для вас сейчас, хорошо, но имейте это в виду на будущее. Удачи! - person Ulrich Eckhardt; 02.07.2013
comment
Спасибо за этот совет. Я мог бы даже подумать о переходе на Debian :) - person itsols; 02.07.2013