在没有C运行时的情况下使用Zig创建32位Windows DLL并删除不必要的导出

btxsgosb  于 2023-04-22  发布在  Windows
关注(0)|答案(1)|浏览(267)

我是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.dlldumpbin /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可以实现所需的行为,但显然这并不明智。
我在寻找最合适的解决方案。

bfrts1fy

bfrts1fy1#

在build.zig for zig-lib中,将“addStaticLibrary”更改为“addSharedLibrary”。然后运行“zig build”重建库,现在您将在.\zig-out\lib目录中拥有一个zig-lib.dll。
Laters,SLDR

相关问题