编译运行duckdb rust插件模板extension-template-rs
下载https://github.com/duckdb/extension-template-rs/archive/refs/heads/main.tar.gz 并解压
进入解压的目录执行build命令行。
/par# cd extension-template-rs-main
/par/extension-template-rs-main# cargo build --releaseUpdating `mirror` indexDownloaded duckdb-loadable-macros v0.1.10 (registry `mirror`)Downloaded miniz_oxide v0.8.0 (registry `mirror`)Downloaded flate2 v1.0.34 (registry `mirror`)Downloaded syn v2.0.79 (registry `mirror`)Downloaded duckdb v1.4.0 (registry `mirror`)Downloaded libduckdb-sys v1.4.0 (registry `mirror`)Downloaded 6 crates (8.8MiB) in 4m 38s (largest was `libduckdb-sys` at 5.6MiB)Compiling libm v0.2.8Compiling autocfg v1.4.0Compiling proc-macro2 v1.0.87Compiling unicode-ident v1.0.13Compiling cfg-if v1.0.0Compiling libc v0.2.159Compiling version_check v0.9.5Compiling bitflags v2.6.0Compiling foldhash v0.1.5Compiling bytes v1.7.2Compiling iana-time-zone v0.1.61Compiling zerocopy v0.7.35Compiling once_cell v1.20.2Compiling static_assertions v1.1.0Compiling hashbrown v0.15.2Compiling lexical-util v1.0.3Compiling rustix v0.38.37Compiling arrow-schema v56.1.0Compiling heck v0.5.0= note: collect2: fatal error: cannot find 'ld'compilation terminated.
链接失败,就把mold所在目录加入搜索路径
/par/extension-template-rs-main# export PATH=$PATH:/par/mold240/bin
/par/extension-template-rs-main# cargo build --releaseCompiling libm v0.2.8Compiling num-traits v0.2.19Compiling proc-macro2 v1.0.87Compiling libc v0.2.159Compiling ahash v0.8.11Compiling rustix v0.38.37Compiling serde v1.0.210Compiling bitflags v2.6.0Compiling linux-raw-sys v0.4.14Compiling rustversion v1.0.17Compiling adler2 v2.0.0Compiling serde_json v1.0.128Compiling prettyplease v0.2.22Compiling memchr v2.7.4Compiling lexical-parse-integer v1.0.2Compiling miniz_oxide v0.8.0Compiling lexical-write-integer v1.0.2Compiling crc32fast v1.4.2Compiling regex-syntax v0.8.5Compiling aho-corasick v1.1.3Compiling ryu v1.0.18Compiling ident_case v1.0.1Compiling strsim v0.11.1Compiling fnv v1.0.7Compiling itoa v1.0.11Compiling lexical-write-float v1.0.2Compiling flate2 v1.0.34Compiling lexical-parse-float v1.0.2Compiling pkg-config v0.3.31Compiling vcpkg v0.2.15Compiling quote v1.0.37Compiling getrandom v0.2.15Compiling filetime v0.2.25Compiling unicode-width v0.1.14Compiling syn v2.0.79Compiling strum v0.26.3Compiling lexical-core v1.0.2Compiling base64 v0.22.1Compiling rust_decimal v1.36.0Compiling arrayvec v0.7.6Compiling hashlink v0.10.0Compiling fallible-streaming-iterator v0.1.9Compiling fallible-iterator v0.3.0Compiling num-integer v0.1.46Compiling num-complex v0.4.6Compiling half v2.4.1Compiling chrono v0.4.41Compiling atoi v2.0.0Compiling cast v0.3.0Compiling num-bigint v0.4.6Compiling num-iter v0.1.45Compiling xattr v1.3.1Compiling regex-automata v0.4.8Compiling tar v0.4.42Compiling num-rational v0.4.2Compiling num v0.4.3Compiling arrow-buffer v56.1.0Compiling darling_core v0.20.10Compiling arrow-data v56.1.0Compiling regex v1.11.0Compiling serde_derive v1.0.210Compiling strum_macros v0.26.4Compiling strum_macros v0.27.2Compiling arrow-array v56.1.0Compiling darling_macro v0.20.10Compiling darling v0.20.10Compiling comfy-table v7.1.1Compiling strum v0.27.2Compiling duckdb-loadable-macros v0.1.10Compiling arrow-select v56.1.0Compiling arrow-arith v56.1.0Compiling arrow-row v56.1.0Compiling arrow-cast v56.1.0Compiling arrow-string v56.1.0Compiling arrow-ord v56.1.0Compiling libduckdb-sys v1.4.0Compiling arrow v56.1.0Compiling duckdb v1.4.0Compiling rusty_quack v0.1.0 (/par/extension-template-rs-main)Finished `release` profile [optimized] target(s) in 30.01s
编译成功,从编译的so文件中查看导出函数是rusty_quack_init_c_api,直接load失败
/par/extension-template-rs-main# nm -D /par/librusty_quack.so |grep init
0000000000014530 T rusty_quack_init_c_api
/par/extension-template-rs-main# /par/duckdb140 -unsigned
DuckDB v1.4.0 (Andium) b8a06e4a22
Enter ".help" for usage hints.
D load '/par/librusty_quack.so';
Invalid Input Error:
Failed to load '/par/librusty_quack.so', The file is not a DuckDB extension. The metadata at the end of the file is invalid
D .exit
利用https://github.com/duckdb/extension-ci-tools/blob/main/scripts/append_extension_metadata.py脚本加入元数据后,就可以加载了。
/par# python3 appendmetadata.py -l librusty_quack.so -n rusty_quack -dv v1.2.0 --duckdb-platform linux_amd64 --extension-version 0.1
Creating extension binary:- Input file: librusty_quack.so- Output file: rusty_quack.duckdb_extension- Metadata:- FIELD8 (unused) = EMPTY- FIELD7 (unused) = EMPTY- FIELD6 (unused) = EMPTY- FIELD5 (abi_type) = C_STRUCT- FIELD4 (extension_version) = 0.1- FIELD3 (duckdb_version) = v1.2.0- FIELD2 (duckdb_platform) = linux_amd64- FIELD1 (header signature) = 4 (special value to identify a duckdb extension)
/par# /par/duckdb140 -unsigned
DuckDB v1.4.0 (Andium) b8a06e4a22
Enter ".help" for usage hints.
D load '/par/rusty_quack.duckdb_extension';
D SELECT * FROM rusty_quack('Jane');
┌─────────────────────┐
│ column0 │
│ varchar │
├─────────────────────┤
│ Rusty Quack Jane 🐥 │
└─────────────────────┘
同样的步骤用于duckdb-rs-main中的examples, load时报错,看来两边生成的so是不一样的。