7

しばらくの間、プログラミングから遠ざかっていた厄介な問題に直面しています。データベースを使用して特定の情報を保存する必要がある個人的なプロジェクトを開始するつもりであり、SQLite を使用することにしましたが、C っぽい API が気に入らなかったため、SQLite wiki で SOCI ラッパーに出会いました。

私は SOCI の公式 Web サイトにアクセスし、ドキュメントを読み、試してみることにしました。ドキュメントの「インストール」の章の指示に従い、すべての要件をインストールした後、コンパイルしてインストールしました。

cmake -DWITH_BOOST=ON -DSOCI_TESTS=ON -DWITH_SQLITE3=ON
make
make test
sudo make install

すべてのテストは正常に完了しましたが、g++ test.cpp -o1 -lsoci_core -lsoci_sqlite3次のようなプログラムを ( でコンパイルした後に)実行しようとすると、次のようになります。

test.cpp:

#include "soci/soci.h"
#include "soci/sqlite3/soci-sqlite3.h"
#include <iostream>

int main()
{
    soci::session sql(soci::sqlite3, "testdb.db");

    return 0;    
}

「共有ライブラリの読み込み中にエラーが発生しました: libsoci_sqlite3.so.3.1: 共有オブジェクト ファイルを開けません: そのようなファイルまたはディレクトリはありません」というエラーが表示されます。しかし、インストール ログを見ると、共有ライブラリがインストールされていることがはっきりとわかります。

4

2 に答える 2

3

私は問題を見つけたと思います。行うこと:

strace -e open ./1 2>&1 | grep soci

以下を出力します。

open("/usr/local/lib/libsoci_core.so.3.1", O_RDONLY) = 3
open("/lib/x86_64-linux-gnu/tls/x86_64/libsoci_sqlite3.so.3.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/tls/libsoci_sqlite3.so.3.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/x86_64/libsoci_sqlite3.so.3.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libsoci_sqlite3.so.3.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/x86_64-linux-gnu/tls/x86_64/libsoci_sqlite3.so.3.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/x86_64-linux-gnu/tls/libsoci_sqlite3.so.3.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/x86_64-linux-gnu/x86_64/libsoci_sqlite3.so.3.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/x86_64-linux-gnu/libsoci_sqlite3.so.3.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/tls/x86_64/libsoci_sqlite3.so.3.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/tls/libsoci_sqlite3.so.3.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/x86_64/libsoci_sqlite3.so.3.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/libsoci_sqlite3.so.3.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/tls/x86_64/libsoci_sqlite3.so.3.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/tls/libsoci_sqlite3.so.3.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/x86_64/libsoci_sqlite3.so.3.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/libsoci_sqlite3.so.3.1", O_RDONLY) = -1 ENOENT (No such file or directory)
./1: error while loading shared libraries: libsoci_sqlite3.so.3.1: cannot open shared object file: No such file or directory

それを見ると、それが検索する/usr/local/lib/だけであるのsoci_coreに対し、通常はsoci_sqlite3同様に検索する必要があることがはっきりとわかります。問題を修正するための迅速で汚いハックは、そこにリストされている他のフォルダーのいずれかにsmylinkを作成することですが、それを修正するためlibsoci_sqlite3.so.3.1のより良い方法があると確信しています。

于 2011-12-12T17:22:24.863 に答える
0

SOCI インストールでは、ライブラリは /usr/local/lib64/ にあります。

次のステートメントが機能するはずです。

g++ test.cpp -o test -I/usr/local/include/soci -L/usr/local/lib64/ -lsoci_core -lsoci_sqlite3 \
-Wl,-rpath=/usr/local/lib64/

于 2014-06-01T06:52:57.250 に答える