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

时间:2012-07-02 08:38:15

标签: c++ orm soci

出于安全原因,我需要静态链接一个程序。

我构建了静态库libsoci_core.a和libsoci_postgresql.a,因为我的后端是postgresql。

我的问题是,当我使用这些库构建程序时,我会收到链接错误。

  

[...] / lib / libsoci_core.a(backend-loader.cpp.o):在功能中   `(匿名命名空间):: do_unload(std :: basic_string,std :: allocator> const&)':

     

backend-loader.cpp :(。text + 0x623):对'dlclose'的未定义引用

查看backend-loader.cpp中的代码,它调用dlclose和其他动态库加载函数。

所以我想知道是否有可能避免这些错误并且有一个'真正'的静态构建。

或者我应该使用什么选项来避免此错误并且代码是否会调用静态posgresql库?

谢谢你!

1 个答案:

答案 0 :(得分:1)

由于您正在尝试构建静态链接库,因此需要删除/删除dl *函数。

一种方法是使用您自己的函数创建一个dlstub.c文件并将它们链接到库。

使用(/usr/include/dlfcn.h)中的原型:

#include <dlfcn.h>

int    dlclose(void *){}
char  *dlerror(void){}
void  *dlopen(const char *, int){}
void  *dlsym(void *restrict, const char *restrict){}

将存根函数编译为* .o文件,并将其链接到编译命令:

gcc -c -O2 -g dlstubs.c
gcc -static ...  -o dlstubs.o ...