2010-12-31 1 views
9

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

Спасибо.

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

+0

Действительно ли вы выполнили 'make install'? Нет необходимости копировать файлы заголовков в каталог вашего проекта. – chrisaycock

+1

Я выполнил эту команду.Если я не копирую эти файлы, компилятор дает ошибку, говоря, что файлы soci.h и soci-mysql.h не найдены. Я просто копирую следующие примеры из примера в документации: [code] #include "soci.h" #include "soci-mysql.h" [/ code], но это не сработало, компилятор сказал, что эти файлы didn Нет, поэтому я попытался скопировать их из пакета soci. – NeDark

ответ

6

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

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

Теперь/USR/местные/включить должны быть в вашем умолчанию включить путь (например, попробовать что-то вроде 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, может иметь смысл добавить Это.

+0

Библиотека выдает исключение «Не удалось найти общую библиотеку для бэкэнд-mysql», даже указав/usr/local/lib в качестве каталога поиска и -rpath, но я мог бы решить, что он копирует три файла .so-файла mysql в каталог проекта. Благодаря! – NeDark

+0

Хм, у меня может быть такое неправильное: возможно, вам нужно только связать в '-lsoci_core', а затем он будет распаковать библиотеку mysql? Странно, что он не может найти библиотеку, хотя, как и было бы известно, что/usr/local/lib будет местом для поиска времени сборки. Извините, я не знаю, что специально, чтобы предложить что-нибудь лучше, но рад, что вы его работаете! – Rup

+0

Нет, я только что попробовал, и он не работает без опции -lsoci_mysql. Я не знаю, почему, но soci также пытается расшифровать бэкэнд-библиотеку mysql. Я нашел файл, где это происходит, чтобы найти ошибку previus в google: http://code.google.com/p/boost-soci/source/browse/trunk/libs/soci/src/backend-loader.cpp?r= 2 PD: Можете ли вы рассказать мне, как вы добавляете «теги кода» в комментарии? – NeDark

2

я получил тот же не загружает бэкэнд ошибку на моей программе 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++.

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

+0

'export LD_DEBUG = files' был очень полезен, спасибо. –