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

如何用MinGW-w64创建含链接时未解析符号的Windows动态库?

问题:MinGW-w64交叉编译带未解析符号的Windows DLL

我有一个名为mylib.c的文件,内容如下:

extern void some_function(void);

int add(int a, int b) {
    some_function();
    return a+b;
} 

目标是将其编译为共享库,其中some_function由库的使用者动态链接,因此构建共享库时该符号需保持未解析状态。

在Ubuntu上用gcc编译Linux共享库时,命令执行成功:

gcc mylib.c -o libmylib.so -shared

但用MinGW-w64交叉编译Windows DLL时,执行以下操作:

sudo apt install -y mingw-w64

x86_64-w64-mingw32-gcc mylib.c -o mylib.dll -shared

出现错误:

/usr/bin/x86_64-w64-mingw32-ld: /tmp/ccWlwvfS.o:mylib.c:(.text+0xf): undefined reference to `some_function'
collect2: error: ld returned 1 exit status

尝试过以下链接选项均无效:

x86_64-w64-mingw32-gcc mylib.c -o mylib.dll -shared -Wl,--no-undefined

x86_64-w64-mingw32-gcc mylib.c -o mylib.dll -shared -Wl,-u,some_function

x86_64-w64-mingw32-gcc mylib.c -o mylib.dll -shared -Wl,-u,_some_function

x86_64-w64-mingw32-gcc mylib.c -o mylib.dll -shared -Wl,-U,some_function

x86_64-w64-mingw32-gcc mylib.c -o mylib.dll -shared -Wl,-U,_some_function

x86_64-w64-mingw32-gcc mylib.c -o mylib.dll -shared -Wl,--unresolved-symbols=ignore-all

求解决方法:如何配置链接器,或用其他方法从Linux主机生成带未解析符号的DLL?


解决方案

Windows DLL的链接机制和Linux共享库不同,默认要求所有符号必须解析。要生成带未解析符号的DLL,需使用以下正确的链接器选项:

基础可行命令

x86_64-w64-mingw32-gcc mylib.c -o mylib.dll -shared -Wl,--allow-shlib-undefined

若仍有问题的增强命令

如果上述命令报错,可结合显式指定未解析符号(MinGW对C语言函数默认添加下划线前缀):

x86_64-w64-mingw32-gcc mylib.c -o mylib.dll -shared -Wl,--allow-shlib-undefined,-u,_some_function

关键选项说明

  • --allow-shlib-undefined:告诉MinGW链接器允许共享库中存在未解析符号,对齐Linux下的默认行为。
  • -u,_some_function:显式标记带下划线前缀的符号为未定义,确保链接器忽略该符号的解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:34:57