You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MinGW构建Windows DLL时DuckDB C-API符号未导出问题

MinGW交叉编译DuckDB Windows版本时C-API符号未导出问题

问题概述

在Linux环境下使用MinGW工具链交叉编译Windows版本DuckDB时,新版库生成的libduckdb.dll未导出任何C-API符号。对比问题提交前的版本(d1ea1538c9~),符号可正常导出,而该提交仅新增11个符号,暂未定位具体原因。

构建配置

构建命令

cmake -B build 
      -DCMAKE_BUILD_TYPE=Release 
      -DCMAKE_TOOLCHAIN_FILE=mingw-w64-x86_64.cmake 
      -DBUILD_EXTENSIONS='autocomplete;icu;parquet;json;fts;tpcds;tpch' 
      -DENABLE_EXTENSION_AUTOLOADING=1 
      -DENABLE_EXTENSION_AUTOINSTALL=1 
      -DBUILD_UNITTESTS=FALSE 
      -DBUILD_SHELL=TRUE 
      -DDUCKDB_EXPLICIT_PLATFORM=x86_64-w64-mingw32-cxx11 .
cmake --build build

MinGW工具链文件

set(CMAKE_SYSTEM_NAME Windows)
set(TOOLCHAIN_PREFIX x86_64-w64-mingw32)

# cross compilers to use for C, C++ and Fortran
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++)
set(CMAKE_Fortran_COMPILER ${TOOLCHAIN_PREFIX}-gfortran)
set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres)

# target environment on the build host system
set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX})

# modify default behavior of FIND_XXX() commands
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

符号验证方法

使用winedump检查DLL的导出符号,以duckdb_vector_size为例:

$ winedump -j export libduckdb.dll | grep duckdb_vector_size
  009F42F0   365  duckdb_vector_size # 正常导出时显示该行,无输出则表示未导出

符号追踪过程(执行于build/src目录)

  1. 确认C-API目标文件存在:
$ tr ' ' '\n' <CMakeFiles/duckdb.dir/objects1.rsp | grep capi.cpp
main/capi/CMakeFiles/duckdb_main_capi.dir/ub_duckdb_main_capi.cpp.obj
  1. 检查目标文件中的符号:
$ nm -C main/capi/CMakeFiles/duckdb_main_capi.dir/ub_duckdb_main_capi.cpp.obj | grep duckdb_vector_size
0000000000004f60 T duckdb_vector_size
  1. 确认归档文件包含该目标文件:
$ /usr/bin/x86_64-w64-mingw32-ar t CMakeFiles/duckdb.dir/objects.a | grep capi.cpp
ub_duckdb_main_capi.cpp.obj
  1. 检查归档文件中的符号:
$ nm -C CMakeFiles/duckdb.dir/objects.a | grep duckdb_vector_size
0000000000004f60 T duckdb_vector_size
  1. 检查归档文件中符号的导出状态:
$ winedump -j export CMakeFiles/duckdb.dir/objects.a | grep duckdb_vector_size
 31a0ae4 duckdb_vector_size
  1. 重新构建DLL:
$ /usr/lib64/ccache/x86_64-w64-mingw32-g++ -O3 -DNDEBUG -O3 -DNDEBUG   -shared -o libduckdb.dll \
    -Wl,--out-implib,libduckdb.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -Wl,--whole-archive \
    CMakeFiles/duckdb.dir/objects.a -Wl,--no-whole-archive @CMakeFiles/duckdb.dir/linkLibs.rsp
  1. 验证DLL中符号存在但未导出:
$ nm -C libduckdb.dll | grep duckdb_vector_size
00000001f3d116e0 T duckdb_vector_size

$ winedump -j export libduckdb.dll | grep duckdb_vector_size # 无输出,符号未导出

内容的提问来源于stack exchange,提问作者suvayu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:09:50