2010-12-31 6 views
9

私は自分のプログラムにsociを実装しようとしていますが、私は方法がわかりません。私はLinux上でC++を使っています.netbeansを使ったプロジェクトです。私はそれをインストールするにはhttp://soci.sourceforge.net/doc/structure.htmlの手順を踏襲していますが、プロジェクトの/ src/backends/mysqlから/ src/coreとsoci-mysql.hからsoci.hファイルをコピーしようとしましたが、コンパイルエラーが発生しますこれらのファイルには他のファイルも含まれていますが、すべてのファイルをディレクトリにコピーするのは理にかなっています...)。私は数回ガイドを読んだが、私が間違っていることを理解していない。例にはこれらのファイルのみが含まれています。SOCI C++ Database libraryの使い方は?

ありがとうございました。

編集:私は答えの下のコメントにさらに情報を与えました。私は社会を実現するためにどのような措置を取らなければならないのか分かりません。

+0

実際に 'make install'を実行しましたか?ヘッダーファイルをプロジェクトのディレクトリにコピーする必要はありません。 – chrisaycock

+1

私はそのコマンドを実行しました。これらのファイルをコピーしないと、コンパイラはsoci.hとsoci-mysql.hファイルが見つからないというエラーを出します。私はちょうどドキュメントの例から次のインクルードをコピーします:#include "soci.h" #include "soci-mysql.h" [/ code]しかし、それは動作しませんでした、コンパイラは、存在していないので、私はそれらをsociパッケージからコピーしようとしました。 – NeDark

答えて

6

configureスクリプトをパラメータなしで実行すると、そのページ上の該当ビットが

で、プロセスの残りの部分は、デフォルトの宛先としてSOCIのヘッダファイルのデフォルトの保存先として/usr/local/include/soci使用し、/usr/local/libます/

今は/ usr/localがデフォルトであるべき含めるライブラリファイルには、パスを含める(例えば、あなたの用途をインストールリストを表示するには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です。しかし、共有バージョンを使用していて、/ usr/local/libがあなたのディストリビューションライブラリ検索パスにない場合(/ etc/ld.so.confおよび/または/etc/ld.so.conf.d/*)、実行時に共有ライブラリを見つけることができません。リンカースイッチ-rpathを使用してライブラリのパスをハードコードするか、システム環境全体の検索パスに/ usr/local/libを追加する必要があります(変数LD_LIBRARY_PATH)。私はこれを行う最良の方法が何であるか分かりません - システムを一般的に変更しないようにするには、-rpathをお勧めします。もし/ usr/local/libにたくさんのライブラリをビルドしているのであれば、それ。

+0

ライブラリは検索ディレクトリと-rpathに/ usr/local/libを指定しても "バックエンドmysqlの共有ライブラリを見つけることができませんでした"という例外がスローされますが、3つのmysqlバックエンド.soファイルをプロジェクトディレクトリにコピーできます。ありがとう! – NeDark

+0

ええと、間違っているかもしれません: '-lsoci_core'でリンクするだけで、mysqlライブラリ自体をdlopenできます。しかし、/ usr/local/libがビルド時を見る場所であることが分かっていたので、ライブラリを見つけることができないのは奇妙です。申し訳ありませんが、特に何か良いことを示唆するために社会を知っていませんが、あなたはそれが働いてうれしい! – Rup

+0

いいえ、私はちょうどそれを試しました - それは、-lsoci_mysqlオプションなしで動作しません。私は理由を知らないが、社会学者もmysqlバックエンドライブラリをdlopenしようとしている。私はそのファイルがGoogleのpreviusエラーを検索している場所を見つけました:http://code.google.com/p/boost-soci/source/browse/trunk/libs/soci/src/backend-loader.cpp?r= 2 PD:コメントに "コードタグ"をどのように置くか教えていただけますか? – NeDark

2

私はsession sql("mysql://db=...)

を実行したときに、私は(少なくとも私のUbuntu 11.04上の)解決策を見つけた私のC++プログラムにバックエンドエラーをロードしません同じを得ました。ただ、やる:

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

システムにないファイル/usr/lib/libsoci_mysql.soためSOCIのライブラリ検索、あなたはそれが動作するシステムでのライブラリー/usr/lib/libsoci_mysql-gcc-3_0-3.0.0.soへのリンクを作る場合は購入(私が思うように見えるのdebian/ubuntuは元の名前からファイル名を変更しますが、元の名前の内部でSOCIライブラリを検索するため、副作用があります。

bash環境変数LD_DEBUG=filesを使用してエラーが見つかり、C++バイナリを実行しています。

希望します。

+0

'export LD_DEBUG = files'はとても役に立ちました。 –