Linking a prebuilt MSVC .lib with Zig's new build system

I’m trying to link a prebuilt .lib file using Zig’s new build system on Windows and I’m getting closer, but I’ve run into an issue that may be related to how Zig handles linking.

My main questions are:

Can Zig use an existing MSVC-generated .lib directly?
Does Zig/LLD fully support linking against MSVC libraries?
Is it possible to make Zig use the MSVC linker instead?
Or does the library need to be rebuilt in a way that’s compatible with Zig’s toolchain?

Relevant details:

Zig version: 0.17.0-dev.87+9b177a7d2
Target: Windows
Library type: static

Any guidance on how Zig handles MSVC .lib files with the new build system would be appreciated.

Build snippet

const std = @import("std");

const targets = [_]std.Target.Query{
    .{ .cpu_arch = .x86_64, .os_tag = .windows, .abi = .msvc },
    .{ .cpu_arch = .aarch64, .os_tag = .windows, .abi = .msvc },
};

pub fn build(b: *std.Build) void {
    const target = b.standardTargetOptions(.{ .whitelist = &targets });
    const optimize = b.standardOptimizeOption(.{});

    // const tsk_dep = switch (.{target.result.cpu.arch, target.result.os.tag}) {
    //     .{.x86_64, .windows} => b.lazyDependency("tsk-windows-x86_64", .{}) orelse return,
    //     .{.aarch64, .windows} => b.lazyDependency("tsk-windows-aarch64", .{}) orelse return,
    //     else => unreachable,
    // };  // ik this is wrong, is there something like this in zig

    const tsk_dep = switch (target.result.cpu.arch) {
        .x86_64 => b.lazyDependency("tsk-windows-x86_64", .{}) orelse return,
        .aarch64 => b.lazyDependency("tsk-windows-aarch64", .{}) orelse return,
        else => unreachable,
    };
    const tsk_lib_path = tsk_dep.path("x64/Release_NoLibs/libtsk.lib");
    const tsk_tc = b.addTranslateC(.{
        .root_source_file = tsk_dep.path("include/tsk/libtsk.h"),
        .target = target,
        .optimize = optimize,
        .link_libc = true,
    });
    tsk_tc.addIncludePath(tsk_dep.path("include"));
    tsk_tc.defineCMacro("_MSC_VER", "1950");
    tsk_tc.defineCMacro("__INTRIN_H", null);
    tsk_tc.defineCMacro("_MODE_T_", null);
    const tsk_mod = tsk_tc.createModule();
    tsk_mod.addObjectFile(tsk_lib_path);    

    const mod = b.addModule("rere_zig", .{
        .root_source_file = b.path("src/root.zig"),
        .target = target,
    });

    const exe = b.addExecutable(.{
        .name = "rere_zig",
        .root_module = b.createModule(.{
            .root_source_file = b.path("src/main.zig"),
            .target = target,
            .optimize = optimize,
            .imports = &.{
                .{ .name = "rere_zig", .module = mod },
                .{
                    .name = "tsk",
                    .module = tsk_mod,
                },
            },
        }),
    });

    const run_step = b.step("run", "Run the app");
    const run_cmd = b.addRunArtifact(exe);
    run_step.dependOn(&run_cmd.step);
    run_cmd.step.dependOn(b.getInstallStep());

    const out_dir = b.fmt("{s}-{s}", .{ @tagName(target.result.cpu.arch), @tagName(target.result.os.tag) });

    const target_output = b.addInstallArtifact(exe, .{
        .dest_dir = .{
            .override = .{
                .custom = out_dir,
            },
        },
    });

    b.getInstallStep().dependOn(&target_output.step);
}

Full error

zig build --verbose-link
lld-link -lldmingw -ERRORLIMIT:0 -NOLOGO -DEBUG -PDB:.zig-cache\o\283771215e72ef80cbf14bf11a2ead6a\build.pdb -PDBALTPATH:build.pdb -MLLVM:-float-abi=hard -STACK:16777216 -BASE:5368709120 -BUILD-ID:NO -MACHINE:X64 -OUT:.zig-cache\o\283771215e72ef80cbf14bf11a2ead6a\build.exe .zig-cache\o\283771215e72ef80cbf14bf11a2ead6a\build_zcu.obj -SUBSYSTEM:console,6.0 -NODEFAULTLIB -ENTRY:wWinMainCRTStartup C:\Users\AUTO\AppData\Local\zig\o\531076a137c91278755243eb07e7a165\compiler_rt.lib C:\Users\AUTO\AppData\Local\zig\o\8823749cfd2a44850521c412d74df968\ntdll.lib C:\Users\AUTO\AppData\Local\zig\o\2d8f1c469679c6fd6b58bee1df84a475\kernel32.lib
install
└─ install rere_zig
   └─ compile exe rere_zig Debug native 1 errors
error: lld-link: x64\Release_NoLibs\logical_img.obj: is not a native COFF file. Recompile without /GL?
error: lld-link -lldmingw -ERRORLIMIT:0 -NOLOGO -DEBUG -PDB:.zig-cache\o\a90f1fc69533bd7e16fcd71f55c62722\rere_zig.pdb -PDBALTPATH:rere_zig.pdb -MLLVM:-float-abi=hard -STACK:16777216 -BASE:5368709120 -BUILD-ID:NO -MACHINE:X64 -OUT:.zig-cache\o\a90f1fc69533bd7e16fcd71f55c62722\rere_zig.exe -IMPLIB:.zig-cache\o\a90f1fc69533bd7e16fcd71f55c62722\rere_zig.lib D:\all\prog_elec_phil\projects\ReRecycleBin\mytry\zig\zig-pkg\N-V-__8AABE9OUXYOg28Vmh6B6j5dE96aZN5Uwe5yGM8nCpF\x64\Release_NoLibs\libtsk.lib .zig-cache\o\a90f1fc69533bd7e16fcd71f55c62722\rere_zig_zcu.obj -SUBSYSTEM:console,6.0 -ALTERNATENAME:__image_base__=__ImageBase C:\Users\AUTO\AppData\Local\zig\o\717ef9067c92fcb01f3ef26fd2505baf\crt2.obj C:\Users\AUTO\AppData\Local\zig\o\c4059443dc00ce5cb4a43f9ebaa987a2\libmingw32.lib C:\Users\AUTO\AppData\Local\zig\o\3be3ee489409b43a7626f61f5c71a1f7\compiler_rt.lib C:\Users\AUTO\AppData\Local\zig\o\d0b3410a2fb5f645497e9077952ec184\api-ms-win-crt-conio-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\3ece3820cc5917a382f2eb19b6660965\api-ms-win-crt-convert-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\b2c76beaf971a2484bc634c8aa1bb236\api-ms-win-crt-environment-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\1cf839b079529db9a572ff9e79c73b59\api-ms-win-crt-filesystem-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\a6925285f97c6c2f233f0fa06c0dabc5\api-ms-win-crt-heap-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\2306687bbc9f53d9bfd0a7b38d0e7e49\api-ms-win-crt-locale-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\1e0eb80ff639efa6745d9bc4d6d3d3dc\api-ms-win-crt-math-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\5df73fa64f22e87ec996fb6f70b7b0cc\api-ms-win-crt-multibyte-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\0bb1f7f480d80ac7c14e9fddfbcb1010\api-ms-win-crt-private-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\9e8b95dac3948e3c2f0b530e56ba723c\api-ms-win-crt-process-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\2b14e6a828459434e763f4775e861c4d\api-ms-win-crt-runtime-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\744e801df18d9a36ef9c0a34d56caab9\api-ms-win-crt-stdio-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\9b13a8139772426a6ede001663eda57c\api-ms-win-crt-string-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\4731b932810e604e32a33b39b8f89bc0\api-ms-win-crt-time-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\835ae4401fbd66252c626b11c790c661\api-ms-win-crt-utility-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\fbd009db99332a266ef75ebb37df2359\advapi32.lib C:\Users\AUTO\AppData\Local\zig\o\2d8f1c469679c6fd6b58bee1df84a475\kernel32.lib C:\Users\AUTO\AppData\Local\zig\o\8823749cfd2a44850521c412d74df968\ntdll.lib C:\Users\AUTO\AppData\Local\zig\o\8e18e55227f085e391b1dd4e16712065\shell32.lib C:\Users\AUTO\AppData\Local\zig\o\9f72bdd9c99453ccafb28bb2b355c5dc\user32.lib

error: 1 compilation errors
failed command: "C:\\Users\\AUTO\\terminal\\zigup-x86_64-windows\\zig\\0.17.0-dev.87+9b177a7d2\\files\\zig.exe" build-exe -ODebug --dep rere_zig --dep tsk "-Mroot=D:\\all\\prog_elec_phil\\projects\\ReRecycleBin\\mytry\\zig\\src\\main.zig" "-Mrere_zig=D:\\all\\prog_elec_phil\\projects\\ReRecycleBin\\mytry\\zig\\src\\root.zig" "D:\\all\\prog_elec_phil\\projects\\ReRecycleBin\\mytry\\zig\\zig-pkg\\N-V-__8AABE9OUXYOg28Vmh6B6j5dE96aZN5Uwe5yGM8nCpF\\x64\\Release_NoLibs\\libtsk.lib" -ODebug "-Mtsk=.zig-cache\\o\\bf19dd510d14121b84d6cc254a9cba84\\libtsk.zig" -lc --verbose-link --cache-dir .zig-cache --global-cache-dir "C:\\Users\\AUTO\\AppData\\Local\\zig" --name rere_zig --zig-lib-dir "C:\\Users\\AUTO\\terminal\\zigup-x86_64-windows\\zig\\0.17.0-dev.87+9b177a7d2\\files\\lib\\" --listen=-

Build Summary: 1/4 steps succeeded (1 failed)
install transitive failure
└─ install rere_zig transitive failure
   └─ compile exe rere_zig Debug native 1 errors

error: the following build command failed with exit code 1:
.zig-cache\o\283771215e72ef80cbf14bf11a2ead6a\build.exe C:\Users\AUTO\terminal\zigup-x86_64-windows\zig\0.17.0-dev.87+9b177a7d2\files\zig.exe C:\Users\AUTO\terminal\zigup-x86_64-windows\zig\0.17.0-dev.87+9b177a7d2\files\lib D:\all\prog_elec_phil\projects\ReRecycleBin\mytry\zig .zig-cache C:\Users\AUTO\AppData\Local\zig --seed 0xebccb740 -Z27ed8d99addb4f25 --verbose-link
D:\all\prog_elec_phil\projects\ReRecycleBin\mytry\zig> zig build --verbose-link
lld-link -lldmingw -ERRORLIMIT:0 -NOLOGO -DEBUG -PDB:.zig-cache\o\20c0cd59617305bd714664beb5622b30\build.pdb -PDBALTPATH:build.pdb -MLLVM:-float-abi=hard -STACK:16777216 -BASE:5368709120 -BUILD-ID:NO -MACHINE:X64 -OUT:.zig-cache\o\20c0cd59617305bd714664beb5622b30\build.exe .zig-cache\o\20c0cd59617305bd714664beb5622b30\build_zcu.obj -SUBSYSTEM:console,6.0 -NODEFAULTLIB -ENTRY:wWinMainCRTStartup C:\Users\AUTO\AppData\Local\zig\o\531076a137c91278755243eb07e7a165\compiler_rt.lib C:\Users\AUTO\AppData\Local\zig\o\8823749cfd2a44850521c412d74df968\ntdll.lib C:\Users\AUTO\AppData\Local\zig\o\2d8f1c469679c6fd6b58bee1df84a475\kernel32.lib
install
└─ install rere_zig
   └─ compile exe rere_zig Debug native 1 errors
error: lld-link: x64\Release_NoLibs\logical_img.obj: is not a native COFF file. Recompile without /GL?
error: lld-link -lldmingw -ERRORLIMIT:0 -NOLOGO -DEBUG -PDB:.zig-cache\o\a90f1fc69533bd7e16fcd71f55c62722\rere_zig.pdb -PDBALTPATH:rere_zig.pdb -MLLVM:-float-abi=hard -STACK:16777216 -BASE:5368709120 -BUILD-ID:NO -MACHINE:X64 -OUT:.zig-cache\o\a90f1fc69533bd7e16fcd71f55c62722\rere_zig.exe -IMPLIB:.zig-cache\o\a90f1fc69533bd7e16fcd71f55c62722\rere_zig.lib D:\all\prog_elec_phil\projects\ReRecycleBin\mytry\zig\zig-pkg\N-V-__8AABE9OUXYOg28Vmh6B6j5dE96aZN5Uwe5yGM8nCpF\x64\Release_NoLibs\libtsk.lib .zig-cache\o\a90f1fc69533bd7e16fcd71f55c62722\rere_zig_zcu.obj -SUBSYSTEM:console,6.0 -ALTERNATENAME:__image_base__=__ImageBase C:\Users\AUTO\AppData\Local\zig\o\717ef9067c92fcb01f3ef26fd2505baf\crt2.obj C:\Users\AUTO\AppData\Local\zig\o\c4059443dc00ce5cb4a43f9ebaa987a2\libmingw32.lib C:\Users\AUTO\AppData\Local\zig\o\3be3ee489409b43a7626f61f5c71a1f7\compiler_rt.lib C:\Users\AUTO\AppData\Local\zig\o\d0b3410a2fb5f645497e9077952ec184\api-ms-win-crt-conio-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\3ece3820cc5917a382f2eb19b6660965\api-ms-win-crt-convert-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\b2c76beaf971a2484bc634c8aa1bb236\api-ms-win-crt-environment-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\1cf839b079529db9a572ff9e79c73b59\api-ms-win-crt-filesystem-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\a6925285f97c6c2f233f0fa06c0dabc5\api-ms-win-crt-heap-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\2306687bbc9f53d9bfd0a7b38d0e7e49\api-ms-win-crt-locale-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\1e0eb80ff639efa6745d9bc4d6d3d3dc\api-ms-win-crt-math-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\5df73fa64f22e87ec996fb6f70b7b0cc\api-ms-win-crt-multibyte-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\0bb1f7f480d80ac7c14e9fddfbcb1010\api-ms-win-crt-private-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\9e8b95dac3948e3c2f0b530e56ba723c\api-ms-win-crt-process-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\2b14e6a828459434e763f4775e861c4d\api-ms-win-crt-runtime-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\744e801df18d9a36ef9c0a34d56caab9\api-ms-win-crt-stdio-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\9b13a8139772426a6ede001663eda57c\api-ms-win-crt-string-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\4731b932810e604e32a33b39b8f89bc0\api-ms-win-crt-time-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\835ae4401fbd66252c626b11c790c661\api-ms-win-crt-utility-l1-1-0.lib C:\Users\AUTO\AppData\Local\zig\o\fbd009db99332a266ef75ebb37df2359\advapi32.lib C:\Users\AUTO\AppData\Local\zig\o\2d8f1c469679c6fd6b58bee1df84a475\kernel32.lib C:\Users\AUTO\AppData\Local\zig\o\8823749cfd2a44850521c412d74df968\ntdll.lib C:\Users\AUTO\AppData\Local\zig\o\8e18e55227f085e391b1dd4e16712065\shell32.lib C:\Users\AUTO\AppData\Local\zig\o\9f72bdd9c99453ccafb28bb2b355c5dc\user32.lib

error: 1 compilation errors
failed command: "C:\\Users\\AUTO\\terminal\\zigup-x86_64-windows\\zig\\0.17.0-dev.87+9b177a7d2\\files\\zig.exe" build-exe -ODebug --dep rere_zig --dep tsk "-Mroot=D:\\all\\prog_elec_phil\\projects\\ReRecycleBin\\mytry\\zig\\src\\main.zig" "-Mrere_zig=D:\\all\\prog_elec_phil\\projects\\ReRecycleBin\\mytry\\zig\\src\\root.zig" "D:\\all\\prog_elec_phil\\projects\\ReRecycleBin\\mytry\\zig\\zig-pkg\\N-V-__8AABE9OUXYOg28Vmh6B6j5dE96aZN5Uwe5yGM8nCpF\\x64\\Release_NoLibs\\libtsk.lib" -ODebug "-Mtsk=.zig-cache\\o\\bf19dd510d14121b84d6cc254a9cba84\\libtsk.zig" -lc --verbose-link --cache-dir .zig-cache --global-cache-dir "C:\\Users\\AUTO\\AppData\\Local\\zig" --name rere_zig --zig-lib-dir "C:\\Users\\AUTO\\terminal\\zigup-x86_64-windows\\zig\\0.17.0-dev.87+9b177a7d2\\files\\lib\\" --listen=-

Build Summary: 1/4 steps succeeded (1 failed)
install transitive failure
└─ install rere_zig transitive failure
   └─ compile exe rere_zig Debug native 1 errors

error: the following build command failed with exit code 1:
.zig-cache\o\20c0cd59617305bd714664beb5622b30\build.exe C:\Users\AUTO\terminal\zigup-x86_64-windows\zig\0.17.0-dev.87+9b177a7d2\files\zig.exe C:\Users\AUTO\terminal\zigup-x86_64-windows\zig\0.17.0-dev.87+9b177a7d2\files\lib D:\all\prog_elec_phil\projects\ReRecycleBin\mytry\zig .zig-cache C:\Users\AUTO\AppData\Local\zig --seed 0xf10aae9e -Ze020e3c942e0c3f2 --verbose-link

if you want the prebuilt library, its a the slueth kit buid ci on github, here’s the link Releases · neo2043/comp · GitHub

I am copying from Microsoft documentation:

.obj files produced with /GL aren’t usable by linker utilities such as EDITBIN and DUMPBIN.

.obj files produced by /GL and precompiled header files shouldn’t be used to build a .lib file

The format of files produced with /GL in the current version often isn’t readable by later versions of Visual Studio and the MSVC toolset. Unless you’re willing to ship copies of the .lib file for all versions of Visual Studio you expect your users to use, now and in the future, don’t ship a .lib file made up of .obj files produced by /GL .

1 Like