编译运行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 --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是不一样的。

<script setup lang="ts"> import { ref, onMounted } from 'vue'; import { NLayout, NLayoutHeader, NLayoutContent, NLayoutFooter, NIcon, NInput, NInputGroup, NButton, NUpload, NCode, NScrollbar, NEmpty, NConfigProvider // 引入配置提供器 } from 'naive-ui'; import { SearchOutline as SearchIcon } from '@vicons/ionicons5'; import hljs from 'highlight.js/lib/core'; import python from 'highlight.js/lib/languages/python'; import 'highlight.js/styles/github.css'; // 导入github主题 // 注册语言 hljs.registerLanguage('python', python); // 可以在这里注册更多语言,如javascript、typescript等 const searchQuery = ref(''); const fileContent = ref(''); const fileName = ref(''); // 根据文件后缀获取语言类型 const getLanguageByExtension = (filename: string) => { const extension = filename.split('.').pop()?.toLowerCase() || ''; const langMap: Record<string, string> = { 'js': 'javascript', 'jsx': 'javascript', 'ts': 'typescript', 'tsx': 'typescript', 'html': 'html', 'css': 'css', 'json': 'json', 'vue': 'html', 'py': 'python', 'java': 'java', 'c': 'c', 'cpp': 'cpp', 'cs': 'csharp', 'php': 'php', 'rb': 'ruby', 'go': 'go', 'rs': 'rust', 'swift': 'swift', 'kt': 'kotlin', 'sh': 'shell', 'md': 'markdown', 'yaml': 'yaml', 'yml': 'yaml', 'xml': 'xml' }; return langMap[extension] || 'text'; }; const handleFileChange = ({ file }: any) => { const selectedFile = file.file as File; if (selectedFile) { if (!selectedFile.type.startsWith('text/') && !selectedFile.name.match(/\.(js|jsx|ts|tsx|html|css|json|vue|py|java|c|cpp|cs|php|rb|go|rs|swift|kt|sh|md|yaml|yml|xml)$/i)) { window.alert('请选择文本或代码文件'); return; } fileName.value = selectedFile.name; searchQuery.value = selectedFile.name; const reader = new FileReader(); reader.onload = (e: ProgressEvent<FileReader>) => { if (e.target?.result) { fileContent.value = e.target.result as string; } }; reader.readAsText(selectedFile); } }; const handleNext = () => { console.log('下一步操作', fileContent.value); window.alert('进入下一步操作!'); }; </script> <template> <!-- 在n-config-provider中注入hljs --> <n-config-provider :hljs="hljs"> <n-layout class="container"> <!-- 顶部图标 --> <n-layout-header class="header"> <n-icon size="48" color="#2080f0"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"> <path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"/> </svg> </n-icon> <h1 class="title">自动化测试平台</h1> </n-layout-header> <!-- 搜索区域 --> <n-layout-content class="search-section"> <n-input-group> <div class="source-label">Source:</div> <n-input v-model="searchQuery" placeholder="输入文件路径或选择文件" readonly size="large" /> <n-upload action="" :show-file-list="false" @change="handleFileChange" > <n-button type="primary" size="large"> <template #icon> <n-icon><search-icon /></n-icon> </template> 选择文件 </n-button> </n-upload> </n-input-group> </n-layout-content> <n-layout-content class="content-display"> <n-scrollbar style="height: 100%"> <div v-if="fileContent"> <!-- 使用n-code组件,并设置show-line-numbers和word-wrap --> <n-code :code="fileContent" :language="getLanguageByExtension(fileName)" show-line-numbers word-wrap /> </div> <n-empty v-else description="未选择文件" /> </n-scrollbar> </n-layout-content> <!-- 底部操作区域 --> <n-layout-footer class="footer"> <n-button type="primary" size="large" :disabled="!fileContent" @click="handleNext" class="action-button" > 下一步 </n-button> </n-layout-footer> </n-layout> </n-config-provider> </template> <style scoped> .container { height: 100vh; display: flex; flex-direction: column; overflow: hidden; } .header { flex: 0 0 auto; display: flex; flex-direction: column; align-items: center; padding: 15px 0; } .title { font-size: 24px; font-weight: bold; margin-top: 8px; color: #333; } .search-section { flex: 0 0 auto; padding: 10px 0 20px; width: 100%; } .n-input-group { display: flex; align-items: center; width: 100%; padding: 0 20px; box-sizing: border-box; } .source-label { font-size: 16px; font-weight: bold; color: #333; white-space: nowrap; margin-right: 12px; } .content-display { flex: 1; min-height: 0; padding: 0 20px; overflow: auto; /* 单一滚动条控制 */ } .code-container { background: #f5f5f5; border-radius: 4px; padding: 15px; max-height: calc(100vh - 250px); /* 动态高度计算 */ } /* 覆盖n-code的样式,确保背景色一致 */ :deep(.n-code) { background: #f5f5f5 !important; padding: 15px; font-size: 15px; line-height: 1.5; max-height: 100%; overflow: auto; } :deep(.n-code-line) { white-space: pre-wrap !important; word-break: break-word !important; } .footer { flex: 0 0 auto; display: flex; justify-content: flex-end; padding: 15px 20px; width: 100%; box-sizing: border-box; } .action-button { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } @media (max-width: 768px) { .search-section, .content-display, .footer { padding-left: 10px; padding-right: 10px; } .n-input-group { flex-direction: column; align-items: flex-start; } .source-label { margin-bottom: 8px; margin-right: 0; } .n-upload { margin-top: 10px; width: 100%; } .n-button { width: 100%; } .action-button { width: 100%; margin-top: 10px; } } </style>上面代码发错了,是改这个代码给我修改样式和布局,这个页面我在鼠标往下滚动的时候会出现两个滚动条(因为父组件已经有了)如果这个页面再来一黑色的滚动条,特别丑,所以给我修改,保留父组件的滚动条,把这个子页面的滚动条删除或者隐藏掉,使其屏幕上只有一个滚动条,返回完整代码
10-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值