出于安全原因,我需要静态链接一个程序。
我构建了静态库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库?
谢谢你!答案 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 ...