前文寫了調用libchdb.so動態連接庫中的未公開導出函數的方法,不久前chdb發布了3.6版,其中提供了靜態鏈接庫。
嘗試編譯一個不依賴龐大動態連接庫libchdb.so的程序,獲得了成功,以下是操作步驟。
1.下載chdb靜態連接庫
wget https://github.com/chdb-io/chdb/releases/download/v3.6.0/linux-aarch64-libchdb-static.tar.gz -c
2.解壓縮
tar xf linux-aarch64-libchdb-static.tar.gz
ll-rw-r--r-- 1 kylin kylin 14491 9月 8 16:20 chdb.h
-rw-r--r-- 1 kylin kylin 16708 9月 8 16:20 chdb.hpp
-rw-r--r-- 1 kylin kylin 1221436992 9月 8 16:05 libchdb.a
可見它包含兩個頭文件,和一個1.2GB的靜態連接庫libchdb.a。而3.5版動態連接庫比這小多了,只有一個頭文件chdb.h文件。
-rw-r--r-- 1 kylin kylin 10287 7月 9 16:11 chdb.h
-rwxr-xr-x 1 kylin kylin 567703784 7月 9 16:06 libchdb.so
3.用前文中同一個源程序編譯目標文件
g++ -c bna.cpp
它不會檢查調用的外部文件
4.將上一步的目標文件和libchdb.a鏈接
g++ bna.o chdba/libchdb.a -o bna
報錯如下,條目很多,列舉3條不同的
chdba/libchdb.a(krb5__threads.c.o):在函數‘krb5int_thread_support_init__aux’中:
(.text.krb5int_thread_support_init__aux+0x114):對‘pthread_once’未定義的引用
chdba/libchdb.a(krb5__plugins.c.o):在函數‘krb5int_open_plugin’中:
(.text.krb5int_open_plugin+0x3c):對‘dlopen’未定義的引用
chdba/libchdb.a(libclickhouse_common_io__QueryProfiler.cpp.o):在函數‘DB::Timer::set(unsigned long)’中:
(.text+0x16c):對‘timer_settime’未定義的引用
查閱資料得知,它們分別依賴動態庫pthread、dl和rt,把它們都加到命令行,連接成功。
g++ bna.o chdba/libchdb.a -o bna -lpthread -ldl -lrt
ls -l bna
-rwxrwxr-x 1 kylin kylin 187010224 9月 12 13:20 bna
./bna
Addition result: 111111111011111111100
Multiplication result: 1219326311370217952237463801111263526900
鏈接后的文件有187MB,比靜態庫和動態庫都小得多,當然對于這么點大數運算功能而言,還是太大了,本文僅作為技術上可實現的討論。