利用rdynamic编译选项解决tcc for windows的加载动态库问题
上文写到tcc for windows编译的so不能被luajit插件调用。再来试其他编译器。在windows用mingw 编译的so能被luajit插件调用。C:\Users\ltcd\d C:\dss C:\dset pathC:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Git\cmd;C:\Users\lt\AppData\Local\Programs\Python\Python313\Scripts\;C:\Users\lt\AppData\Local\Programs\Python\Python313\;C:\Users\lt\AppData\Local\Microsoft\WindowsApps;;C:\Users\lt\AppData\Local\Programs\Ollama;C:\Users\lt\.dotnet\tools;C:\d\mingw64\bin;C:\d\pypy C:\dgcc -shared -fPIC -o libsudoku_c6.so sudoku_solve.c C:\dduckdb155 DuckDB v1.5.5 (Variegata) Enter .help for usage hints. memory D load luajit; memory D SELECT * FROM luajit_module(mode : compile, sql_name : sudoku_c, source : return function(p) local ffi require(ffi) ffi.cdef[[ int sudoku_solve(const char *p, char *out); ]] local lib ffi.load(./libsudoku_c6.so) local buf ffi.new(char[82]) local rc lib.sudoku_solve(p, buf) if rc ~ 1 then return NULL end return ffi.string(buf) end ); ┌─────────┬─────────┬─────────┬─────────┬─────────┬──────────┐ │ ok │ mode │ phase │ message │ detail │ sql_name │ │ boolean │ varchar │ varchar │ varchar │ varchar │ varchar │ ├─────────┼─────────┼─────────┼─────────┼─────────┼──────────┤ │ true │ compile │ compile │ OK │ │ sudoku_c │ └─────────┴─────────┴─────────┴─────────┴─────────┴──────────┘ memory D SELECT luajit_s(sudoku_c, 000001002000020030004500600007600050080090006100005800001004000070900003400030020); ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ luajit_s(sudoku_c, 000001002000020030004500600007600050080090006100005800001004000070900003400030020) │ │ varchar │ ├───────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ 359461782716829534824573619947682351583197246162345897631254978275918463498736125 │ └───────────────────────────────────────────────────────────────────────────────────────────────────────────┘ memory D SELECT * FROM luajit_module(mode : compile, sql_name : sudoku_c, source : return function(p) local ffi require(ffi) ffi.cdef[[ int sudoku_solve(const char *p, char *out); ]] local lib ffi.load(./libsudoku_c.so) local buf ffi.new(char[82]) local rc lib.sudoku_solve(p, buf) if rc ~ 1 then return NULL end return ffi.string(buf) end ); ┌─────────┬─────────┬─────────┬─────────┬─────────┬──────────┐ │ ok │ mode │ phase │ message │ detail │ sql_name │ │ boolean │ varchar │ varchar │ varchar │ varchar │ varchar │ ├─────────┼─────────┼─────────┼─────────┼─────────┼──────────┤ │ true │ compile │ compile │ OK │ │ sudoku_c │ └─────────┴─────────┴─────────┴─────────┴─────────┴──────────┘ memory D SELECT luajit_s(sudoku_c, 000001002000020030004500600007600050080090006100005800001004000070900003400030020); ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ luajit_s(sudoku_c, 000001002000020030004500600007600050080090006100005800001004000070900003400030020) │ │ varchar │ ├───────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ NULL │ └───────────────────────────────────────────────────────────────────────────────────────────────────────────┘ memory D在luajit中调试较难改用一个c源文件来在tcc中调试。#includestdio.hintsudoku_solve(constchar*p,char*out);intmain(){// 一个简单的数独题目constchar*puzzle530070000600195000098000060800060003400803001700020006060000280000419005000080079;charsolution[82];if(sudoku_solve(puzzle,solution)){printf(Solution found!\n);for(inti0;i9;i){for(intj0;j9;j){printf(%c ,solution[i*9j]);}printf(\n);}}else{printf(No solution exists.\n);}return0;}神奇tcc编译main函数源文件时不识别tcc 自己编的so文件却能识别mingw编的。C:\dtcc\tcc callsd.c ./libsudoku_c.so -o callsdt.exe tcc: error: undefined symbol sudoku_solve C:\dtcc\tcc callsd.c ./libsudoku_c6.so -o callsdt.exe C:\dcallsdt Solution found! 5 3 4 6 7 8 9 1 2查看tcc命令行帮助信息解决了。windows中tcc同时用-shared和rdynamic这两个选项编译就妥了。tcc --help -shared generate a shared library/dll -rdynamic export all global symbols to dynamic linker C:\dtcc\tcc -shared -rdynamic -o libsudoku_c.dll dlxdll.c编译同时产生了libsudoku_c2.def文件内容如下LIBRARY libsudoku_c2.dll EXPORTS DllMain _dllstart _edata _end _etext sudoku_solve然后编译就不报tcc: error: undefined symbol sudoku_solve错了。C:\dtcc\tcc callsd.c ./libsudoku_c.dll -o callsdt2.exe C:\dcallsdt2.exe Solution found! 5 3 4 6 7 8 9 1 2 6 7 2 1 9 5 3 4 8 1 9 8 3 4 2 5 6 7 8 5 9 7 6 1 4 2 3 4 2 6 8 5 3 7 9 1 7 1 3 9 2 4 8 5 6 9 6 1 5 3 7 2 8 4 2 8 7 4 1 9 6 3 5 3 4 5 2 8 6 1 7 9再用另一种算法的源文件编译dll也正确。C:\dtcc\tcc -shared -rdynamic -o libsudoku_c2.dll sudoku_solve.c C:\dtcc\tcc callsd.c ./libsudoku_c2.dll -o callsdt3.exe C:\dcallsdt3.exe Solution found! 5 3 4 6 7 8 9 1 2 6 7 2 1 9 5 3 4 8 1 9 8 3 4 2 5 6 7 8 5 9 7 6 1 4 2 3 4 2 6 8 5 3 7 9 1 7 1 3 9 2 4 8 5 6 9 6 1 5 3 7 2 8 4 2 8 7 4 1 9 6 3 5 3 4 5 2 8 6 1 7 9这样编译出的动态库在luajit中也能正确识别。C:\dduckdb155 DuckDB v1.5.5 (Variegata) Enter .help for usage hints. memory D load luajit; memory D SELECT * FROM luajit_module(mode : compile, sql_name : sudoku_c, source : return function(p) local ffi require(ffi) ffi.cdef[[ int sudoku_solve(const char *p, char *out); ]] local lib ffi.load(./libsudoku_c2.dll) local buf ffi.new(char[82]) local rc lib.sudoku_solve(p, buf) if rc ~ 1 then return NULL end return ffi.string(buf) end ); ┌─────────┬─────────┬─────────┬─────────┬─────────┬──────────┐ │ ok │ mode │ phase │ message │ detail │ sql_name │ │ boolean │ varchar │ varchar │ varchar │ varchar │ varchar │ ├─────────┼─────────┼─────────┼─────────┼─────────┼──────────┤ │ true │ compile │ compile │ OK │ │ sudoku_c │ └─────────┴─────────┴─────────┴─────────┴─────────┴──────────┘ memory D SELECT luajit_s(sudoku_c, 000001002000020030004500600007600050080090006100005800001004000070900003400030020); ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ luajit_s(sudoku_c, 000001002000020030004500600007600050080090006100005800001004000070900003400030020) │ │ varchar │ ├───────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ 359461782716829534824573619947682351583197246162345897631254978275918463498736125 │ └───────────────────────────────────────────────────────────────────────────────────────────────────────────┘这样tcc for windows的加载动态库问题解决了奇怪tcc在linux中编译不需要rdynamic选项。

相关新闻

MySQL索引维护实战:DROP INDEX操作原理、场景与避坑指南

MySQL索引维护实战:DROP INDEX操作原理、场景与避坑指南

1. 索引维护:不止于创建,更在于“保养”在数据库的世界里,给表加上索引,就像是给一本厚厚的书加上目录,能极大提升查询效率。这个道理,无论是刚入门的新手,还是经验丰富的老DBA,都深…

2026/8/17 3:51:18 阅读更多 →
激光大气传输原理与工程实践:衰减、湍流、热晕效应全解析

激光大气传输原理与工程实践:衰减、湍流、热晕效应全解析

1. 从“光剑”到“星地通信”:为什么大气是激光的“考官”如果你看过科幻电影,可能会觉得激光在空气中穿梭是件理所当然的事——一道笔直、明亮、能量集中的光束,指哪打哪。但现实远比电影复杂。当一束纯净、高度定向的激光离开实验室的窗口&…

2026/8/17 3:50:18 阅读更多 →
PageOffice插件部署与排错全指南:解决Edge浏览器安装失败与兼容性问题

PageOffice插件部署与排错全指南:解决Edge浏览器安装失败与兼容性问题

1. 从“安装失败”到“稳定运行”:一个PageOffice老兵的踩坑实录如果你正在为“Edge浏览器PageOffice插件安装了用不了”而抓狂,或者被“电脑一直弹出PageOffice无法安装程序”的弹窗折磨得心力交瘁,那么恭喜你,这篇内容就是为你准…

2026/8/17 3:50:18 阅读更多 →

最新新闻

数学建模竞赛全攻略:从组队到论文的实战指南

数学建模竞赛全攻略:从组队到论文的实战指南

1. 从零到一:我理解的数学建模竞赛是什么如果你是一名理工科或者经管类专业的大学生,大概率听说过“数学建模竞赛”这个名字。它不像高数考试那样有标准答案,也不像编程比赛那样比拼纯粹的代码能力。我第一次接触时,也觉得它有点“…

2026/8/17 4:39:30 阅读更多 →
特殊特性与关键特性:从概念到实践的风险管控指南

特殊特性与关键特性:从概念到实践的风险管控指南

1. 项目概述:从“特性”的迷雾中厘清关键路径在任何一个产品开发、质量管理或者技术方案评审的现场,你大概率会听到这样的讨论:“这个功能是‘关键特性’吗?”、“那个参数算不算‘特殊特性’?”。这两个词&#xff0c…

2026/8/17 4:39:30 阅读更多 →
游戏育种系统数学建模:从概率计算到帕鲁高效培育策略

游戏育种系统数学建模:从概率计算到帕鲁高效培育策略

1. 从“玄学”到“科学”:为什么我们需要为帕鲁育种建立数学模型 如果你在《幻兽帕鲁》里沉迷过孵蛋,那你一定经历过这种时刻:看着满仓库的帕鲁,手里攥着两个“极品”父母本,满怀希望地合上孵化器,然后………

2026/8/17 4:37:30 阅读更多 →
计算机网络链路层:帧封装与差错检测技术详解

计算机网络链路层:帧封装与差错检测技术详解

1. 链路层基础概念与核心职责 计算机网络体系结构中,链路层作为物理层之上的第二层,承担着将原始比特流转化为有意义数据帧的关键任务。在实际工程实践中,我常把链路层比作"数据快递员"——它不仅要确保包裹(数据帧&…

2026/8/17 4:37:30 阅读更多 →
AI可观测性:从数据漂移到模型监控的工程实践

AI可观测性:从数据漂移到模型监控的工程实践

如果你是一名开发者,最近可能已经注意到一个消息:专注于 AI 可观测性的初创公司 Arize AI,被全球应用性能监控和可观测性巨头 Dynatrace 收购了。这不仅仅是一则普通的行业新闻。它背后传递的信号是:AI 系统的“可观测性”需求&am…

2026/8/17 4:37:30 阅读更多 →
Vite项目中优雅Mock数据:vite-plugin-mock插件实战与避坑指南

Vite项目中优雅Mock数据:vite-plugin-mock插件实战与避坑指南

1. 项目概述:为什么我们需要在Vite项目中优雅地Mock数据?在Vite构建的Vue3项目中,前端开发与后端API开发往往是并行的。如果前端开发必须等待后端接口完全就绪才能进行,那项目进度就会像堵车一样停滞不前。这时候,Mock…

2026/8/17 4:37:30 阅读更多 →

日新闻

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必修课? 如果你用LabVIEW做过稍微复杂点的项目,尤其是涉及界面响应、多任务并行或者硬件IO等待的场景,大概率遇到过这样的窘境:前面板点个按钮,整个程序就“卡死…

2026/8/17 0:00:08 阅读更多 →
LabVIEW异步调用实战:解决界面卡顿与并行处理难题

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必经之路如果你在LabVIEW里写过稍微复杂点的程序,尤其是涉及到界面响应、多任务并行或者硬件IO等待,大概率会遇到一个头疼的问题:程序“卡”住了。前面板点不动,进度条不更新…

2026/8/17 0:00:08 阅读更多 →
飞书局域网文件传输实战:3种方案实现高速点对点传输

飞书局域网文件传输实战:3种方案实现高速点对点传输

1. 项目概述:为什么要在局域网内用飞书传文件? 飞书作为一款主流的协同办公套件,其核心功能是围绕云端协作设计的。无论是文档、表格还是文件,通常的分享逻辑都是“上传到云端 -> 生成链接 -> 分享给同事”。这个流程在互联…

2026/8/17 0:00:08 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/17 2:58:27 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/17 2:58:30 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/17 2:58:32 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/16 6:00:23 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/16 6:00:24 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/16 6:00:27 阅读更多 →