如何用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
相关产品推荐
相关产品推荐

