使用Clang编译的共享DLL缺失sql.c中的duckffi_*符号问题
问题分析
你编译的DLL里没导出sql.c中的duckffi_*符号,核心原因是Windows平台下Clang默认不会自动导出共享库的函数符号,只有显式标记的符号才会被放进DLL的符号表。
解决方法
1. 显式标记要导出的符号
方法一:修改源码
直接在sql.c里所有duckffi_*函数的声明前加__declspec(dllexport),比如:
__declspec(dllexport) void duckffi_execute_sql() { // 函数实现 }
方法二:用.def文件(不用改源码)
新建一个duckdb_exports.def文件,把要导出的函数列进去:
EXPORTS duckffi_connect duckffi_execute_sql duckffi_disconnect // 把所有需要导出的duckffi_*函数都列在这里
然后编译时把这个.def文件加到命令里:
clang src/sql.c -O3 -shared -o bin/libduckdb.dll -I"C:\projects\deno-duckdb-master\include" -L"C:\projects\deno-duckdb-master\bin" -lduckdb duckdb_exports.def
2. 调整编译命令顺序(避坑)
Windows下用Clang编译时,把依赖库(-lduckdb)放在源文件后面,能避免一些链接异常,上面的命令已经调整过顺序了。
3. 验证结果
重新编译完,用Dependencies工具看libduckdb.dll,应该能在导出表看到duckffi_*符号,这时再用Deno.dlopen加载就能找到对应的符号了。
内容的提问来源于stack exchange,提问作者localhost
相关产品推荐
相关产品推荐

