2012-07-02 51 views
0

爲了安全起見,我需要將程序靜態鏈接到soci。Soci作爲linux/ubuntu上的靜態庫?

我構建了靜態庫libsoci_core.a和libsoci_postgresql.a,因爲我的後端是postgresql。

我的問題是,當我用這些庫建立我的程序時,我得到鏈接錯誤。

[...]/LIB/libsoci_core.a(後端-loader.cpp.o):在功能 `(匿名命名空間):: do_unload(性病:: basic_string的,標準::分配器>常量&) ':

後端-loader.cpp :(文字+ 0x623):未定義的引用`dlclose'

綜觀後端-loader.cpp的代碼,它調用dlclose等動態庫加載功能。

所以我想知道是否有可能避免這些錯誤,並有一個'真正的'靜態構建。

或者我應該使用什麼樣的選項來避免這個錯誤,並且代碼會調用靜態posgresql庫?

謝謝!

回答

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 ... 
+0

thx,我會試試這個! – unludo