Как правильно установить SOCI? - PullRequest
7 голосов
/ 12 декабря 2011

Я столкнулся с досадной проблемой, которая некоторое время удерживала меня от программирования.Я намереваюсь начать личный проект, в котором мне нужно использовать базу данных для хранения определенной информации, и я решил использовать SQLite, однако мне не понравился API C-ish, поэтому я наткнулся на оболочку SOCI в вики SQLite.

Я зашел на официальный сайт SOCI, прочитал документацию и решил попробовать.Я следовал инструкциям в главе «Установка» документации и после установки всех требований скомпилировал и установил с:

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: невозможно открыть общую»объектный файл: нет такого файла или каталога. "но, глядя на журнал установки , я ясно вижу, что общая библиотека установлена.

Ответы [ 2 ]

3 голосов
/ 12 декабря 2011

Мне кажется, я нашел проблему. Делать:

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 в любой из других папок, перечисленных там, но я совершенно уверен, что есть лучший способ исправить это.

0 голосов
/ 01 июня 2014

На вашей установке 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 /

...