我正面临一个恼人的问题,一直困扰我从编程中恢复过来。 我打算开始一个个人项目,我需要使用数据库来存储某些信息,然后我决定使用SQLite,但我不喜欢C-ish API,所以我在SQLite wiki中遇到了SOCI包装器。

我去了官方的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:无法打开共享对象文件:没有这样的文件或目录。” 但是看一下安装日志,我可以清楚地看到已经安装了共享库。

===============>>#1 票数: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 修复问题的快速而肮脏的黑客是在libsoci_sqlite3.so.3.1中创建了一个smylink到其中libsoci_sqlite3.so.3.1的任何其他文件夹,但我很确定有更好的方法来修复它。

===============>>#2 票数: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 /本地/ lib64下/

  ask by Mihai Bişog translate from so

未解决问题?本站智能推荐:

1回复

社会图书馆未解决的符号错误

我了解什么是无法解决的符号错误,但我不明白为什么在这种特定情况下使用此特定库会得到它。 这是错误的输出。 请注意,我正在使用以下链接标志: 还请注意,正在解析对其他符号的引用(例如, soci::session构造函数和析构函数)。 我究竟做错了什么? 我还应该链接另一
2回复

如何在Windows 10上正确安装SOCI C ++库?

我想用C ++进行数据库编码。 我的工具箱中应该包含哪些现代C ++库? 表明SOCI是一个很好的跨平台,免费的库。 但是SOCI的安装是一个大问题,因为我找不到很好的博客,教程或文章,也没有提供任何详细的摘要。 我按照SOCI官方页面http://soci.sourceforge.ne
1回复

SOCI问题

我正在尝试使用SOCI库来方便地访问MySQL,但是我仍然坚持安装该库。 到目前为止,我所做的是: 制作项目并使用CMake进行编译 将我的项目链接到编译后创建的lib / release directoy。 将我的项目链接到MySQL C Connector l
1回复

行的SOCI向量

我正在尝试从SOCI获取行向量,但似乎无法解决。 我需要一个函数来从sql语句返回行数据的向量。 我认为正确的方法是: 这将无法编译。 我必须索引到行,我看不到它如何工作。 更新: 我对C ++的期望不高,所以我最终使用了一个简单的解决方案: 其中tFi
2回复

未解析的SOCI外部符号“ struct soci :: mysql_backend_factory const soci :: mysql”

我真的很困惑,我陷入了这个问题,希望您能为我提供帮助: 我使用的是Windows 8.1,Visual Studio Express 2013和SOCI 3.2.2 我已经编译了libsoci_mysql和libsoci_core并将它们链接到我的项目中,但是当我启动编译时会出现此错
1回复

SOCI:如何处理许多列?

我正在使用SOCI访问PostgreSQL数据库。 我要插入的一个特定表(目前)有72列。 我的问题是,如何最好地处理这么多列? 我确定对于选择而言,使用SOCI动态结果集可能是最好的。 这样,我可以遍历各列。 但是,插入时遇到困难。 我要实现的目标如下: 这样有可能
2回复

Soci会话未释放连接

我正在使用soci来使我的应用程序与数据库交互,目前我正在使用MySQL服务器进行测试。 我已经将SOCI包装到简单的类中,在该类的Connect方法中调用session.open() 然后在析构函数中调用close方法 但是当我几次使用该类(创建和销毁该类的对象)时,我发现s
2回复

如何使用SOCI为SELECT *编码?

在大多数关于SOCI的示例中,调用方必须知道查询中的字段和类型,并通过boost::tuple<>的soci::rowset<> boost::tuple<>或通过其他某种方式来指定它们。 有没有一种方法可以像SELECT * FROM ...查询中那样
1回复

Soci作为linux / ubuntu上的静态库?

出于安全原因,我需要将程序与soci静态链接。 我建立了静态库libsoci_core.a和libsoci_postgresql.a,因为我的后端是postgresql。 我的问题是,当我使用这些库构建程序时,出现链接错误。 [...] / lib / libsoci_co
2回复

SOCI无法准备声明

我有一个这样的功能: 当我使用以下代码在程序中调用它时: 我得到以下异常: 如果您能帮助我检测到缺失的部分,我将不胜感激,谢谢