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

问题描述 投票:0回答:1

我是 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
使用。
请告诉我是否有原因将其导出,或者是否有办法防止它被导出。

我发现注释掉

@export
中的
lib/std/start.zig
实现了预期的行为,但显然这不是一个聪明的做法。
我正在寻找最合适的解决方案。

windows dll zig
1个回答
0
投票

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

后来, 单反

© www.soinside.com 2019 - 2024. All rights reserved.