Как использовать библиотеку базы данных SOCI C++?

Я пытаюсь внедрить soci в свою программу, но не знаю как. Я использую C++ в Linux, в проекте, использующем NetBeans. Я выполнил следующие шаги: http://soci.sourceforge.net/doc/structure.html чтобы установить его, и попытался скопировать файлы soci.h из / src / core и soci-mysql.h из / src / backends / mysql в моем проекте, но он дает ошибку компиляции (эти файлы включают в себя другие файлы soci, но нелогично копировать все файлы в каталог...). Я прочитал руководство несколько раз, но я не понимаю, что я делаю неправильно. Примеры включают только эти файлы.

Благодарю.

Изменить: я дал больше информации в комментарии под ответом. Я не знаю, какие шаги я должен выполнить, чтобы реализовать soci.

2 ответа

Решение

Соответствующий бит на этой странице

Когда скрипт configure запускается без параметров, оставшаяся часть процесса будет использовать /usr/local/include/soci в качестве места назначения по умолчанию для заголовочных файлов SOCI и /usr/local/lib в качестве места назначения по умолчанию для библиотечных файлов

Теперь / usr / local / include должен быть в вашем пути включения по умолчанию (например, попробуйте что-то вроде gcc -c -v -x c++ /dev/null -o /dev/null чтобы увидеть список, который использует ваша установка), и вы можете включить их, используя

#include <soci/soci.h>
#include <soci/soci-mysql.h>

Затем вам нужно добавить библиотеки к шагу ссылки. Похоже, у вас будут как статические, так и общие версии библиотек. Вам нужно будет добавить -lsoci_core -lsoci_mysql к вашей ссылке шаг; однако, если это не сработает, вам также нужно указать / usr / local / lib в качестве каталога поиска, т.е. -L/usr/local/lib -lsoci_core -lsoci_mysql, (Опять же, это, вероятно, уже есть, но вы можете увидеть, используя gcc -print-search-dirs. Однако проблема в том, что если вы используете общую версию, а / usr / local / lib отсутствует в пути поиска библиотеки дистрибутивов (см. /Etc/ld.so.conf и / или / etc / ld).so.conf.d/*) тогда он не сможет найти общую библиотеку во время выполнения. Вам нужно будет либо жестко кодировать путь к библиотеке с помощью переключателя компоновщика -rpath или добавьте / usr / local / lib к общесистемному пути поиска, как раньше или в вашей среде (переменная LD_LIBRARY_PATH). Я не уверен, что лучший способ сделать это - я бы предложил -rpath чтобы вообще не изменять систему, хотя, если вы собираете много библиотек в / usr / local / lib, возможно, имеет смысл добавить ее.

Я получил то же самое , не загружает ошибку бэкенда в моей программе C++, когда я выполняю session sql("mysql://db=...)

Я нашел решение (по крайней мере, на моем Ubuntu 11.04). Просто делать:

sudo -i ln -s /usr/lib/libsoci_mysql-gcc-3_0-3.0.0.so /usr/lib/libsoci_mysql.so

Похоже, что библиотека SOCI ищет файл /usr/lib/libsoci_mysql.so что нет в системе, купи если сделаешь ссылку на библиотеку /usr/lib/libsoci_mysql-gcc-3_0-3.0.0.so он работает в системе (я думаю, что debian / ubuntu изменяет имя файла по сравнению с оригинальным, но у него есть побочные эффекты, потому что библиотека SOCI ищет внутри оригинальное имя).

Я нашел ошибку, используя переменную окружения bash LD_DEBUG=files и работает мой бинарный C++.

Надеюсь, поможет.

Другие вопросы по тегам