下载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 --release
Updating `mirror` index
Downloaded 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.8
Compiling autocfg v1.4.0
Compiling proc-macro2 v1.0.87
Compiling unicode-ident v1.0.13
Compiling cfg-if v1.0.0
Compiling libc v0.2.159
Compiling version_check v0.9.5
Compiling bitflags v2.6.0
Compiling foldhash v0.1.5
Compiling bytes v1.7.2
Compiling iana-time-zone v0.1.61
Compiling zerocopy v0.7.35
Compiling once_cell v1.20.2
Compiling static_assertions v1.1.0
Compiling hashbrown v0.15.2
Compiling lexical-util v1.0.3
Compiling rustix v0.38.37
Compiling arrow-schema v56.1.0
Compiling 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 --release
Compiling libm v0.2.8
Compiling num-traits v0.2.19
Compiling proc-macro2 v1.0.87
Compiling libc v0.2.159
Compiling ahash v0.8.11
Compiling rustix v0.38.37
Compiling serde v1.0.210
Compiling bitflags v2.6.0
Compiling linux-raw-sys v0.4.14
Compiling rustversion v1.0.17
Compiling adler2 v2.0.0
Compiling serde_json v1.0.128
Compiling prettyplease v0.2.22
Compiling memchr v2.7.4
Compiling lexical-parse-integer v1.0.2
Compiling miniz_oxide v0.8.0
Compiling lexical-write-integer v1.0.2
Compiling crc32fast v1.4.2
Compiling regex-syntax v0.8.5
Compiling aho-corasick v1.1.3
Compiling ryu v1.0.18
Compiling ident_case v1.0.1
Compiling strsim v0.11.1
Compiling fnv v1.0.7
Compiling itoa v1.0.11
Compiling lexical-write-float v1.0.2
Compiling flate2 v1.0.34
Compiling lexical-parse-float v1.0.2
Compiling pkg-config v0.3.31
Compiling vcpkg v0.2.15
Compiling quote v1.0.37
Compiling getrandom v0.2.15
Compiling filetime v0.2.25
Compiling unicode-width v0.1.14
Compiling syn v2.0.79
Compiling strum v0.26.3
Compiling lexical-core v1.0.2
Compiling base64 v0.22.1
Compiling rust_decimal v1.36.0
Compiling arrayvec v0.7.6
Compiling hashlink v0.10.0
Compiling fallible-streaming-iterator v0.1.9
Compiling fallible-iterator v0.3.0
Compiling num-integer v0.1.46
Compiling num-complex v0.4.6
Compiling half v2.4.1
Compiling chrono v0.4.41
Compiling atoi v2.0.0
Compiling cast v0.3.0
Compiling num-bigint v0.4.6
Compiling num-iter v0.1.45
Compiling xattr v1.3.1
Compiling regex-automata v0.4.8
Compiling tar v0.4.42
Compiling num-rational v0.4.2
Compiling num v0.4.3
Compiling arrow-buffer v56.1.0
Compiling darling_core v0.20.10
Compiling arrow-data v56.1.0
Compiling regex v1.11.0
Compiling serde_derive v1.0.210
Compiling strum_macros v0.26.4
Compiling strum_macros v0.27.2
Compiling arrow-array v56.1.0
Compiling darling_macro v0.20.10
Compiling darling v0.20.10
Compiling comfy-table v7.1.1
Compiling strum v0.27.2
Compiling duckdb-loadable-macros v0.1.10
Compiling arrow-select v56.1.0
Compiling arrow-arith v56.1.0
Compiling arrow-row v56.1.0
Compiling arrow-cast v56.1.0
Compiling arrow-string v56.1.0
Compiling arrow-ord v56.1.0
Compiling libduckdb-sys v1.4.0
Compiling arrow v56.1.0
Compiling duckdb v1.4.0
Compiling 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是不一样的。

8180

被折叠的 条评论
为什么被折叠?



