使用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目录)
- 确认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
- 检查目标文件中的符号:
$ nm -C main/capi/CMakeFiles/duckdb_main_capi.dir/ub_duckdb_main_capi.cpp.obj | grep duckdb_vector_size 0000000000004f60 T duckdb_vector_size
- 确认归档文件包含该目标文件:
$ /usr/bin/x86_64-w64-mingw32-ar t CMakeFiles/duckdb.dir/objects.a | grep capi.cpp ub_duckdb_main_capi.cpp.obj
- 检查归档文件中的符号:
$ nm -C CMakeFiles/duckdb.dir/objects.a | grep duckdb_vector_size 0000000000004f60 T duckdb_vector_size
- 检查归档文件中符号的导出状态:
$ winedump -j export CMakeFiles/duckdb.dir/objects.a | grep duckdb_vector_size 31a0ae4 duckdb_vector_size
- 重新构建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
- 验证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
相关产品推荐
相关产品推荐

