9

我正在尝试在我的程序中实现 soci,但我不知道如何。我在 Linux 上使用 C++,在使用 netbeans 的项目中。我已按照以下步骤进行安装:http : //soci.sourceforge.net/doc/structure.html 安装它,我尝试从 /src/core 复制文件 soci.h 并从 /src 复制 soci-mysql.h /backends/mysql 在我的项目中,但它给出了编译错误(这些文件包括其他 soci 文件,但是将所有文件复制到目录中是不合逻辑的......)。我已经多次阅读指南,但我不明白我做错了什么。示例仅包括这些文件。

谢谢。

编辑:我在答案下方的评论中提供了更多信息。我不知道实现 soci 必须遵循哪些步骤。

4

2 回答 2

8

该页面上的相关位是

当 configure 脚本不带参数运行时,进程的剩余部分将/usr/local/include/soci用作 SOCI 头文件/usr/local/lib的默认目标和库文件的默认目标

现在 /usr/local/include 应该在您的默认包含路径中(例如尝试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. (同样,它可能已经存在,但您可以看到 using 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 中构建了很多库,添加它可能是有意义的.

于 2011-01-02T21:48:08.117 回答
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++ 二进制文件发现了错误。

希望能帮助到你。

于 2011-11-29T18:38:36.783 回答