编译DuckDB c++插件模板并加载运行
到DuckDB c++插件模板官方存储库网页下载源代码压缩包,解压缩到/par
采用如下命令行编译和添加元数据,其中/par/duck/src/include是duckdb.hpp所在目录,/par/duck/build/src是libduckdb.so所在目录。
g++ -fPIC -shared -o libtest2.so *.cpp -I /par/duck/src/include -lssl -lcrypto -I include -lduckdb -L /par/duck/build/srcpython3 ./appendmetadata.py -l libtest2.so -n quack -dv v1.2.0 --duckdb-platform linux_amd64 --extension-version 0.1
如果不指定-lduckdb, load时会报undefined symbol错误。
root@6ae32a5ffcde:/par/extension-template-main/src# /par/duckdb130 -unsigned
DuckDB v1.3.0 (Ossivalis) 71c5c07cdd
Enter ".help" for usage hints.
D load '/par/extension-template-main/src/quack.duckdb_extension';
IO Error:
Extension "/par/extension-template-main/src/quack.duckdb_extension" could not be loaded: /par/extension-template-main/src/quack.duckdb_extension: undefined symbol: _ZNK6duckdb18BaseScalarFunction8ToStringB5cxx11Ev
此外,还要指定LD_LIBRARY_PATH环境变量,否则会报could not be loaded: libduckdb.so错误
root@6ae32a5ffcde:/par/extension-template-main/src# /par/duckdb130 -unsigned
DuckDB v1.3.0 (Ossivalis) 71c5c07cdd
Enter ".help" for usage hints.
D load '/par/extension-template-main/src/quack.duckdb_extension';
IO Error:
Extension "/par/extension-template-main/src/quack.duckdb_extension" could not be loaded: libduckdb.so: cannot open shared object file: No such file or directory
D .exit
root@6ae32a5ffcde:/par/extension-template-main/src# export LD_LIBRARY_PATH=/par/duck/build/src
root@6ae32a5ffcde:/par/extension-template-main/src# /par/duckdb130 -unsigned
DuckDB v1.3.0 (Ossivalis) 71c5c07cdd
Enter ".help" for usage hints.
D load '/par/extension-template-main/src/quack.duckdb_extension';
IO Error:
File "/par/extension-template-main/src/quack.duckdb_extension" did not contain function "quack_init_c_api": /par/extension-template-main/src/quack.duckdb_extension: undefined symbol: quack_init_c_api
这是因为这是c++模板,并不存在quack_init_c_api函数,可以用nm命令验证,而我们在appendmetadata.py中未指定abi_type,默认就是c api
nm -D quack.duckdb_extension |grep quack_init000000000001648d T quack_init
所以需要人工指定abi_type为空字符串,但是坏处就是开始挑版本了
python3 ./appendmetadata.py -l libtest2.so -n quack -dv v1.2.0 --duckdb-platform linux_amd64 --extension-version 0.1 --abi-type ""root@6ae32a5ffcde:/par/extension-template-main/src# /par/duckdb130 -unsigned
DuckDB v1.3.0 (Ossivalis) 71c5c07cdd
Enter ".help" for usage hints.
D load '/par/extension-template-main/src/quack.duckdb_extension';
Invalid Input Error:
Failed to load '/par/extension-template-main/src/quack.duckdb_extension', The file was built specifically for DuckDB version 'v1.2.0' and can only be loaded with that version of DuckDB. (this version of DuckDB is 'v1.3.0')
将版本改成1.3.0, 通过
python3 ./appendmetadata.py -l libtest2.so -n quack -dv v1.3.0 --duckdb-platform linux_amd64 --extension-version 0.1 --abi-type ""
Creating extension binary:- Input file: libtest2.so- Output file: quack.duckdb_extension- Metadata:- FIELD8 (unused) = EMPTY- FIELD7 (unused) = EMPTY- FIELD6 (unused) = EMPTY- FIELD5 (abi_type) =- FIELD4 (extension_version) = 0.1- FIELD3 (duckdb_version) = v1.3.0- FIELD2 (duckdb_platform) = linux_amd64- FIELD1 (header signature) = 4 (special value to identify a duckdb extension)
root@6ae32a5ffcde:/par/extension-template-main/src# /par/duckdb130 -unsigned
DuckDB v1.3.0 (Ossivalis) 71c5c07cdd
Enter ".help" for usage hints.
D load '/par/extension-template-main/src/quack.duckdb_extension';
D select quack('jack');
┌───────────────┐
│ quack('jack') │
│ varchar │
├───────────────┤
│ Quack jack 🐥 │
└───────────────┘D select quack_openssl_version('abc');
┌───────────────────────────────────────────────────────────────────┐
│ quack_openssl_version('abc') │
│ varchar │
├───────────────────────────────────────────────────────────────────┤
│ Quack abc, my linked OpenSSL version is OpenSSL 3.0.15 3 Sep 2024 │
└───────────────────────────────────────────────────────────────────┘