我是 Zig 语言的新手,对创建 32 位 Windows DLL 有疑问。
我正在使用
zig-windows-x86_64-0.11.0-dev.2612+56d800ff7.zip
.
我用
zig init-lib
创建了一个项目,但是生成的build.zig
好像是针对静态库的,所以我忽略了它。
要创建没有调试信息的发布版本,我使用了以下命令:
zig build-lib -O ReleaseFast -fstrip -target x86-windows-gnu -dynamic src/main.zig
然而,这个命令产生了几个
undefined symbol
错误,例如:
error: lld-link: <root>: undefined symbol: _DllMainCRTStartup@12
error: lld-link: <root>: undefined symbol: add
error: lld-link: <root>: undefined symbol: _tls_index
error: lld-link: <root>: undefined symbol: _tls_start
error: lld-link: <root>: undefined symbol: _tls_end
error: lld-link: <root>: undefined symbol: __xl_a
error: lld-link: <root>: undefined symbol: __xl_z
error: lld-link: <root>: undefined symbol: _tls_used
在选项中添加
-lc
允许编译成功,但我认为这不是正确的解决方案,因为 Zig 不依赖于 C 运行时。此外,用
main.dll
检查生成的 dumpbin /EXPORTS
表明 _DllMainCRTStartup@12
被导出:
ordinal hint RVA name
1 0 00001000 _DllMainCRTStartup@12 = __DllMainCRTStartup@12
2 1 00001010 add = _add
我认为这是不必要的,因为它是 DLL 入口点,不应该被
GetProcAddress
使用。我发现注释掉
@export
中的lib/std/start.zig
实现了预期的行为,但显然这不是一个聪明的做法。在 zig-lib 的 build.zig 中,将“addStaticLibrary”更改为“addSharedLibrary”。然后运行“zig build”重建库,现在你将在 .\zig-out\lib 目录中有一个 zig-lib.dll。
后来, 单反