我是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运行时。
我想知道是否有一种方法可以在没有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
使用。
请告诉我,是否有原因,这是被出口,或者如果有一种方法,以防止它被出口。
我发现在lib/std/start.zig
中注解掉@export
可以实现所需的行为,但显然这并不明智。
我在寻找最合适的解决方案。
1条答案
按热度按时间bfrts1fy1#
在build.zig for zig-lib中,将“addStaticLibrary”更改为“addSharedLibrary”。然后运行“zig build”重建库,现在您将在.\zig-out\lib目录中拥有一个zig-lib.dll。
Laters,SLDR