编译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/src

python3 ./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_init

000000000001648d 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 │
└───────────────────────────────────────────────────────────────────┘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值