0

出于安全原因,我需要将程序与 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): undefined reference to `dlclose'

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

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

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

谢谢你!

4

1 回答 1

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 ...
于 2012-07-02T09:30:27.023 回答