Skip to content

Data symbols marked with __declspec(dllexport) do not link correctly to extern var when using the MSVC ABI #21749

Description

@kcbanner

Zig Version

0.14.0-dev.1951+857383689

Steps to Reproduce and Observed Behavior

extern fn can succesfully link with function symbols marked with __declspec(dllexport), it matches the behaviour as if __declspec(dllimport) had been used. This works on both -gnu and -msvc.

However, only with the -msvc ABI, extern var cannot link with data symbols marked with __declspec(dllexport).

Given this source and build script:

conststd=@import("std");
pubfnbuild(b: *std.Build) void {
consttarget=b.standardTargetOptions(.{});
constoptimize=b.standardOptimizeOption(.{});
constfoo_shared=b.addSharedLibrary(.{
.name="foo_shared",
.target=target,
.optimize=optimize,
});
foo_shared.defineCMacro("FOO_API", "__declspec(dllexport)");
foo_shared.addCSourceFile(.{ .file=b.path("src/foo.c"), .flags= &.{} });
foo_shared.linkLibC();
b.installArtifact(foo_shared);
constfoo_cpp_shared=b.addSharedLibrary(.{
.name="foo_cpp_shared",
.target=target,
.optimize=optimize,
});
foo_cpp_shared.defineCMacro("FOO_API", "__declspec(dllexport)");
foo_cpp_shared.addCSourceFile(.{ .file=b.path("src/foo.cpp"), .flags= &.{} });
if (target.result.abi==.msvc)
foo_cpp_shared.linkLibC()
elsefoo_cpp_shared.linkLibCpp();
b.installArtifact(foo_cpp_shared);
constexe=b.addExecutable(.{
.name="dllimport",
.root_source_file=b.path("src/main.zig"),
.target=target,
.optimize=optimize,
});
exe.linkLibrary(foo_shared);
exe.linkLibrary(foo_cpp_shared);
b.installArtifact(exe);
}

foo.h:

#ifndefFOO_API#defineFOO_API#endifFOO_APIintfoo();
FOO_APIintfoo_data;
FOO_APIvoid* (*foo_function_pointer)(intbar);
#if_MSC_VER#include<windows.h>BOOLWINAPIDllMain(HINSTANCEhinstDLL, DWORDfdwReason, LPVOIDlpvReserved)
{
return TRUE;
}
#endif

foo.c

#include"foo.h"intfoo() {
return7;
};
intfoo_data=8;
void* (*foo_function_pointer)(intbar) =0;

foo.hpp:

#ifndefFOO_API#defineFOO_API#endif#ifdef__cplusplusextern"C" {
#endifFOO_APIintfoo_cpp();
FOO_APIexternintfoo_cpp_data;
FOO_APIexternvoid* (*foo_cpp_function_pointer)(intbar);
#if_MSC_VER#include<windows.h>BOOLWINAPIDllMain(HINSTANCEhinstDLL, DWORDfdwReason, LPVOIDlpvReserved)
{
return TRUE;
}
#endif#ifdef__cplusplus
} /* extern "C" */#endif

foo.cpp

#include"foo.hpp"intfoo_cpp() {
return9;
};
intfoo_cpp_data=10;
void* (*foo_cpp_function_pointer)(intbar) =nullptr;

Produces this output with -gnu:

> zig build -Dtarget=x86_64-windows-gnu && zig-out\bin\dllimport.exe
foo() says: 7
foo_data is: u32@100000008
foo_function_pointer is: null
foo_cpp() says: 9
foo_cpp_data is: u32@10000000a
foo_cpp_function_pointer is: null

But fails to link with -msvc:

>zig build -Dtarget=x86_64-windows-msvc && zig-out\bin\dllimport.exe
install
└─ install dllimport
└─ zig build-exe dllimport Debug x86_64-windows-msvc 4 errors
error: lld-link: undefined symbol: foo_data
note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:14
note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
error: lld-link: undefined symbol: foo_function_pointer
note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:15
note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
error: lld-link: undefined symbol: foo_cpp_data
note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:18
note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
error: lld-link: undefined symbol: foo_cpp_function_pointer
note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:19
note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
error: the following command failed with 4 compilation errors:
C:\cygwin64\home\kcbanner\kit\zig\build-stage3-release\bin\zig.exe build-exe c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\89dd1bf28160503a9c8636fb7182d3a2\foo_shared.lib c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\a55b9a2d906f932dd72ab4d979d22921\foo_cpp_shared.lib -ODebug -target x86_64-windows-msvc -mcpu baseline -I C:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\b4fda69f43e846a2309c0948ef9aabbc -I C:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\b4fda69f43e846a2309c0948ef9aabbc -Mroot=C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig -lc --cache-dir c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache --global-cache-dir e:\dev\zig-cache --name dllimport --zig-lib-dir C:\cygwin64\home\kcbanner\kit\zig\build-stage3-release\lib\zig\ --listen=-
Build Summary: 6/9 steps succeeded; 1 failed

Note that only the data symbols are undefined. The functions link as expected.

Expected Behavior

Expected successful linking and matching output to -gnu.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugObserved behavior contradicts documented or intended behavioros-windowsMicrosoft Windows

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
       blocks
      (function() {
      function addCopyButtons() {
      document.querySelectorAll('pre code').forEach(function(codeBlock) {
      if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
      codeBlock.parentElement.setAttribute('data-copy-added', 'true');
      var btn = document.createElement('button');
      btn.textContent = 'Copy';
      btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
      btn.onmouseover = function() { this.style.opacity = '1'; };
      btn.onmouseout = function() { this.style.opacity = '0.7'; };
      btn.onclick = function() {
      navigator.clipboard.writeText(codeBlock.textContent).then(function() {
      btn.textContent = 'Copied!';
      setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
      });
      };
      codeBlock.parentElement.style.position = 'relative';
      codeBlock.parentElement.appendChild(btn);
      });
      }
      addCopyButtons();
      // Re-run on dynamic content
      var observer = new MutationObserver(addCopyButtons);
      observer.observe(document.body, { childList: true, subtree: true });
      })();
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      Data symbols marked with `__declspec(dllexport)` do not link correctly to `extern var` when using the MSVC ABI · Issue #21749 · ziglang/zig · GitHub
      Skip to content

      Data symbols marked with __declspec(dllexport) do not link correctly to extern var when using the MSVC ABI #21749

      Description

      @kcbanner

      Zig Version

      0.14.0-dev.1951+857383689

      Steps to Reproduce and Observed Behavior

      extern fn can succesfully link with function symbols marked with __declspec(dllexport), it matches the behaviour as if __declspec(dllimport) had been used. This works on both -gnu and -msvc.

      However, only with the -msvc ABI, extern var cannot link with data symbols marked with __declspec(dllexport).

      Given this source and build script:

      conststd=@import("std");
      pubfnbuild(b: *std.Build) void {
      consttarget=b.standardTargetOptions(.{});
      constoptimize=b.standardOptimizeOption(.{});
      constfoo_shared=b.addSharedLibrary(.{
      .name="foo_shared",
      .target=target,
      .optimize=optimize,
      });
      foo_shared.defineCMacro("FOO_API", "__declspec(dllexport)");
      foo_shared.addCSourceFile(.{ .file=b.path("src/foo.c"), .flags= &.{} });
      foo_shared.linkLibC();
      b.installArtifact(foo_shared);
      constfoo_cpp_shared=b.addSharedLibrary(.{
      .name="foo_cpp_shared",
      .target=target,
      .optimize=optimize,
      });
      foo_cpp_shared.defineCMacro("FOO_API", "__declspec(dllexport)");
      foo_cpp_shared.addCSourceFile(.{ .file=b.path("src/foo.cpp"), .flags= &.{} });
      if (target.result.abi==.msvc)
      foo_cpp_shared.linkLibC()
      elsefoo_cpp_shared.linkLibCpp();
      b.installArtifact(foo_cpp_shared);
      constexe=b.addExecutable(.{
      .name="dllimport",
      .root_source_file=b.path("src/main.zig"),
      .target=target,
      .optimize=optimize,
      });
      exe.linkLibrary(foo_shared);
      exe.linkLibrary(foo_cpp_shared);
      b.installArtifact(exe);
      }

      foo.h:

      #ifndefFOO_API#defineFOO_API#endifFOO_APIintfoo();
      FOO_APIintfoo_data;
      FOO_APIvoid* (*foo_function_pointer)(intbar);
      #if_MSC_VER#include<windows.h>BOOLWINAPIDllMain(HINSTANCEhinstDLL, DWORDfdwReason, LPVOIDlpvReserved)
      {
      return TRUE;
      }
      #endif

      foo.c

      #include"foo.h"intfoo() {
      return7;
      };
      intfoo_data=8;
      void* (*foo_function_pointer)(intbar) =0;

      foo.hpp:

      #ifndefFOO_API#defineFOO_API#endif#ifdef__cplusplusextern"C" {
      #endifFOO_APIintfoo_cpp();
      FOO_APIexternintfoo_cpp_data;
      FOO_APIexternvoid* (*foo_cpp_function_pointer)(intbar);
      #if_MSC_VER#include<windows.h>BOOLWINAPIDllMain(HINSTANCEhinstDLL, DWORDfdwReason, LPVOIDlpvReserved)
      {
      return TRUE;
      }
      #endif#ifdef__cplusplus
      } /* extern "C" */#endif

      foo.cpp

      #include"foo.hpp"intfoo_cpp() {
      return9;
      };
      intfoo_cpp_data=10;
      void* (*foo_cpp_function_pointer)(intbar) =nullptr;

      Produces this output with -gnu:

      > zig build -Dtarget=x86_64-windows-gnu && zig-out\bin\dllimport.exe
      foo() says: 7
      foo_data is: u32@100000008
      foo_function_pointer is: null
      foo_cpp() says: 9
      foo_cpp_data is: u32@10000000a
      foo_cpp_function_pointer is: null
      

      But fails to link with -msvc:

      >zig build -Dtarget=x86_64-windows-msvc && zig-out\bin\dllimport.exe
      install
      └─ install dllimport
      └─ zig build-exe dllimport Debug x86_64-windows-msvc 4 errors
      error: lld-link: undefined symbol: foo_data
      note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:14
      note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
      error: lld-link: undefined symbol: foo_function_pointer
      note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:15
      note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
      error: lld-link: undefined symbol: foo_cpp_data
      note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:18
      note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
      error: lld-link: undefined symbol: foo_cpp_function_pointer
      note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:19
      note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
      error: the following command failed with 4 compilation errors:
      C:\cygwin64\home\kcbanner\kit\zig\build-stage3-release\bin\zig.exe build-exe c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\89dd1bf28160503a9c8636fb7182d3a2\foo_shared.lib c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\a55b9a2d906f932dd72ab4d979d22921\foo_cpp_shared.lib -ODebug -target x86_64-windows-msvc -mcpu baseline -I C:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\b4fda69f43e846a2309c0948ef9aabbc -I C:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\b4fda69f43e846a2309c0948ef9aabbc -Mroot=C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig -lc --cache-dir c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache --global-cache-dir e:\dev\zig-cache --name dllimport --zig-lib-dir C:\cygwin64\home\kcbanner\kit\zig\build-stage3-release\lib\zig\ --listen=-
      Build Summary: 6/9 steps succeeded; 1 failed
      

      Note that only the data symbols are undefined. The functions link as expected.

      Expected Behavior

      Expected successful linking and matching output to -gnu.

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        bugObserved behavior contradicts documented or intended behavioros-windowsMicrosoft Windows

        Type

        No type

        Projects

        No projects

          Milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Data symbols marked with `__declspec(dllexport)` do not link correctly to `extern var` when using the MSVC ABI · Issue #21749 · ziglang/zig · GitHub
          Skip to content

          Data symbols marked with __declspec(dllexport) do not link correctly to extern var when using the MSVC ABI #21749

          Description

          @kcbanner

          Zig Version

          0.14.0-dev.1951+857383689

          Steps to Reproduce and Observed Behavior

          extern fn can succesfully link with function symbols marked with __declspec(dllexport), it matches the behaviour as if __declspec(dllimport) had been used. This works on both -gnu and -msvc.

          However, only with the -msvc ABI, extern var cannot link with data symbols marked with __declspec(dllexport).

          Given this source and build script:

          conststd=@import("std");
          pubfnbuild(b: *std.Build) void {
          consttarget=b.standardTargetOptions(.{});
          constoptimize=b.standardOptimizeOption(.{});
          constfoo_shared=b.addSharedLibrary(.{
          .name="foo_shared",
          .target=target,
          .optimize=optimize,
          });
          foo_shared.defineCMacro("FOO_API", "__declspec(dllexport)");
          foo_shared.addCSourceFile(.{ .file=b.path("src/foo.c"), .flags= &.{} });
          foo_shared.linkLibC();
          b.installArtifact(foo_shared);
          constfoo_cpp_shared=b.addSharedLibrary(.{
          .name="foo_cpp_shared",
          .target=target,
          .optimize=optimize,
          });
          foo_cpp_shared.defineCMacro("FOO_API", "__declspec(dllexport)");
          foo_cpp_shared.addCSourceFile(.{ .file=b.path("src/foo.cpp"), .flags= &.{} });
          if (target.result.abi==.msvc)
          foo_cpp_shared.linkLibC()
          elsefoo_cpp_shared.linkLibCpp();
          b.installArtifact(foo_cpp_shared);
          constexe=b.addExecutable(.{
          .name="dllimport",
          .root_source_file=b.path("src/main.zig"),
          .target=target,
          .optimize=optimize,
          });
          exe.linkLibrary(foo_shared);
          exe.linkLibrary(foo_cpp_shared);
          b.installArtifact(exe);
          }

          foo.h:

          #ifndefFOO_API#defineFOO_API#endifFOO_APIintfoo();
          FOO_APIintfoo_data;
          FOO_APIvoid* (*foo_function_pointer)(intbar);
          #if_MSC_VER#include<windows.h>BOOLWINAPIDllMain(HINSTANCEhinstDLL, DWORDfdwReason, LPVOIDlpvReserved)
          {
          return TRUE;
          }
          #endif

          foo.c

          #include"foo.h"intfoo() {
          return7;
          };
          intfoo_data=8;
          void* (*foo_function_pointer)(intbar) =0;

          foo.hpp:

          #ifndefFOO_API#defineFOO_API#endif#ifdef__cplusplusextern"C" {
          #endifFOO_APIintfoo_cpp();
          FOO_APIexternintfoo_cpp_data;
          FOO_APIexternvoid* (*foo_cpp_function_pointer)(intbar);
          #if_MSC_VER#include<windows.h>BOOLWINAPIDllMain(HINSTANCEhinstDLL, DWORDfdwReason, LPVOIDlpvReserved)
          {
          return TRUE;
          }
          #endif#ifdef__cplusplus
          } /* extern "C" */#endif

          foo.cpp

          #include"foo.hpp"intfoo_cpp() {
          return9;
          };
          intfoo_cpp_data=10;
          void* (*foo_cpp_function_pointer)(intbar) =nullptr;

          Produces this output with -gnu:

          > zig build -Dtarget=x86_64-windows-gnu && zig-out\bin\dllimport.exe
          foo() says: 7
          foo_data is: u32@100000008
          foo_function_pointer is: null
          foo_cpp() says: 9
          foo_cpp_data is: u32@10000000a
          foo_cpp_function_pointer is: null
          

          But fails to link with -msvc:

          >zig build -Dtarget=x86_64-windows-msvc && zig-out\bin\dllimport.exe
          install
          └─ install dllimport
          └─ zig build-exe dllimport Debug x86_64-windows-msvc 4 errors
          error: lld-link: undefined symbol: foo_data
          note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:14
          note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
          error: lld-link: undefined symbol: foo_function_pointer
          note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:15
          note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
          error: lld-link: undefined symbol: foo_cpp_data
          note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:18
          note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
          error: lld-link: undefined symbol: foo_cpp_function_pointer
          note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:19
          note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
          error: the following command failed with 4 compilation errors:
          C:\cygwin64\home\kcbanner\kit\zig\build-stage3-release\bin\zig.exe build-exe c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\89dd1bf28160503a9c8636fb7182d3a2\foo_shared.lib c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\a55b9a2d906f932dd72ab4d979d22921\foo_cpp_shared.lib -ODebug -target x86_64-windows-msvc -mcpu baseline -I C:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\b4fda69f43e846a2309c0948ef9aabbc -I C:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\b4fda69f43e846a2309c0948ef9aabbc -Mroot=C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig -lc --cache-dir c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache --global-cache-dir e:\dev\zig-cache --name dllimport --zig-lib-dir C:\cygwin64\home\kcbanner\kit\zig\build-stage3-release\lib\zig\ --listen=-
          Build Summary: 6/9 steps succeeded; 1 failed
          

          Note that only the data symbols are undefined. The functions link as expected.

          Expected Behavior

          Expected successful linking and matching output to -gnu.

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            bugObserved behavior contradicts documented or intended behavioros-windowsMicrosoft Windows

            Type

            No type

            Projects

            No projects

              Milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Data symbols marked with `__declspec(dllexport)` do not link correctly to `extern var` when using the MSVC ABI · Issue #21749 · ziglang/zig · GitHub
              Skip to content

              Data symbols marked with __declspec(dllexport) do not link correctly to extern var when using the MSVC ABI #21749

              Description

              @kcbanner

              Zig Version

              0.14.0-dev.1951+857383689

              Steps to Reproduce and Observed Behavior

              extern fn can succesfully link with function symbols marked with __declspec(dllexport), it matches the behaviour as if __declspec(dllimport) had been used. This works on both -gnu and -msvc.

              However, only with the -msvc ABI, extern var cannot link with data symbols marked with __declspec(dllexport).

              Given this source and build script:

              conststd=@import("std");
              pubfnbuild(b: *std.Build) void {
              consttarget=b.standardTargetOptions(.{});
              constoptimize=b.standardOptimizeOption(.{});
              constfoo_shared=b.addSharedLibrary(.{
              .name="foo_shared",
              .target=target,
              .optimize=optimize,
              });
              foo_shared.defineCMacro("FOO_API", "__declspec(dllexport)");
              foo_shared.addCSourceFile(.{ .file=b.path("src/foo.c"), .flags= &.{} });
              foo_shared.linkLibC();
              b.installArtifact(foo_shared);
              constfoo_cpp_shared=b.addSharedLibrary(.{
              .name="foo_cpp_shared",
              .target=target,
              .optimize=optimize,
              });
              foo_cpp_shared.defineCMacro("FOO_API", "__declspec(dllexport)");
              foo_cpp_shared.addCSourceFile(.{ .file=b.path("src/foo.cpp"), .flags= &.{} });
              if (target.result.abi==.msvc)
              foo_cpp_shared.linkLibC()
              elsefoo_cpp_shared.linkLibCpp();
              b.installArtifact(foo_cpp_shared);
              constexe=b.addExecutable(.{
              .name="dllimport",
              .root_source_file=b.path("src/main.zig"),
              .target=target,
              .optimize=optimize,
              });
              exe.linkLibrary(foo_shared);
              exe.linkLibrary(foo_cpp_shared);
              b.installArtifact(exe);
              }

              foo.h:

              #ifndefFOO_API#defineFOO_API#endifFOO_APIintfoo();
              FOO_APIintfoo_data;
              FOO_APIvoid* (*foo_function_pointer)(intbar);
              #if_MSC_VER#include<windows.h>BOOLWINAPIDllMain(HINSTANCEhinstDLL, DWORDfdwReason, LPVOIDlpvReserved)
              {
              return TRUE;
              }
              #endif

              foo.c

              #include"foo.h"intfoo() {
              return7;
              };
              intfoo_data=8;
              void* (*foo_function_pointer)(intbar) =0;

              foo.hpp:

              #ifndefFOO_API#defineFOO_API#endif#ifdef__cplusplusextern"C" {
              #endifFOO_APIintfoo_cpp();
              FOO_APIexternintfoo_cpp_data;
              FOO_APIexternvoid* (*foo_cpp_function_pointer)(intbar);
              #if_MSC_VER#include<windows.h>BOOLWINAPIDllMain(HINSTANCEhinstDLL, DWORDfdwReason, LPVOIDlpvReserved)
              {
              return TRUE;
              }
              #endif#ifdef__cplusplus
              } /* extern "C" */#endif

              foo.cpp

              #include"foo.hpp"intfoo_cpp() {
              return9;
              };
              intfoo_cpp_data=10;
              void* (*foo_cpp_function_pointer)(intbar) =nullptr;

              Produces this output with -gnu:

              > zig build -Dtarget=x86_64-windows-gnu && zig-out\bin\dllimport.exe
              foo() says: 7
              foo_data is: u32@100000008
              foo_function_pointer is: null
              foo_cpp() says: 9
              foo_cpp_data is: u32@10000000a
              foo_cpp_function_pointer is: null
              

              But fails to link with -msvc:

              >zig build -Dtarget=x86_64-windows-msvc && zig-out\bin\dllimport.exe
              install
              └─ install dllimport
              └─ zig build-exe dllimport Debug x86_64-windows-msvc 4 errors
              error: lld-link: undefined symbol: foo_data
              note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:14
              note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
              error: lld-link: undefined symbol: foo_function_pointer
              note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:15
              note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
              error: lld-link: undefined symbol: foo_cpp_data
              note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:18
              note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
              error: lld-link: undefined symbol: foo_cpp_function_pointer
              note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:19
              note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
              error: the following command failed with 4 compilation errors:
              C:\cygwin64\home\kcbanner\kit\zig\build-stage3-release\bin\zig.exe build-exe c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\89dd1bf28160503a9c8636fb7182d3a2\foo_shared.lib c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\a55b9a2d906f932dd72ab4d979d22921\foo_cpp_shared.lib -ODebug -target x86_64-windows-msvc -mcpu baseline -I C:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\b4fda69f43e846a2309c0948ef9aabbc -I C:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\b4fda69f43e846a2309c0948ef9aabbc -Mroot=C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig -lc --cache-dir c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache --global-cache-dir e:\dev\zig-cache --name dllimport --zig-lib-dir C:\cygwin64\home\kcbanner\kit\zig\build-stage3-release\lib\zig\ --listen=-
              Build Summary: 6/9 steps succeeded; 1 failed
              

              Note that only the data symbols are undefined. The functions link as expected.

              Expected Behavior

              Expected successful linking and matching output to -gnu.

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                bugObserved behavior contradicts documented or intended behavioros-windowsMicrosoft Windows

                Type

                No type

                Projects

                No projects

                  Milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Data symbols marked with `__declspec(dllexport)` do not link correctly to `extern var` when using the MSVC ABI · Issue #21749 · ziglang/zig · GitHub
                  Skip to content

                  Data symbols marked with __declspec(dllexport) do not link correctly to extern var when using the MSVC ABI #21749

                  Description

                  @kcbanner

                  Zig Version

                  0.14.0-dev.1951+857383689

                  Steps to Reproduce and Observed Behavior

                  extern fn can succesfully link with function symbols marked with __declspec(dllexport), it matches the behaviour as if __declspec(dllimport) had been used. This works on both -gnu and -msvc.

                  However, only with the -msvc ABI, extern var cannot link with data symbols marked with __declspec(dllexport).

                  Given this source and build script:

                  conststd=@import("std");
                  pubfnbuild(b: *std.Build) void {
                  consttarget=b.standardTargetOptions(.{});
                  constoptimize=b.standardOptimizeOption(.{});
                  constfoo_shared=b.addSharedLibrary(.{
                  .name="foo_shared",
                  .target=target,
                  .optimize=optimize,
                  });
                  foo_shared.defineCMacro("FOO_API", "__declspec(dllexport)");
                  foo_shared.addCSourceFile(.{ .file=b.path("src/foo.c"), .flags= &.{} });
                  foo_shared.linkLibC();
                  b.installArtifact(foo_shared);
                  constfoo_cpp_shared=b.addSharedLibrary(.{
                  .name="foo_cpp_shared",
                  .target=target,
                  .optimize=optimize,
                  });
                  foo_cpp_shared.defineCMacro("FOO_API", "__declspec(dllexport)");
                  foo_cpp_shared.addCSourceFile(.{ .file=b.path("src/foo.cpp"), .flags= &.{} });
                  if (target.result.abi==.msvc)
                  foo_cpp_shared.linkLibC()
                  elsefoo_cpp_shared.linkLibCpp();
                  b.installArtifact(foo_cpp_shared);
                  constexe=b.addExecutable(.{
                  .name="dllimport",
                  .root_source_file=b.path("src/main.zig"),
                  .target=target,
                  .optimize=optimize,
                  });
                  exe.linkLibrary(foo_shared);
                  exe.linkLibrary(foo_cpp_shared);
                  b.installArtifact(exe);
                  }

                  foo.h:

                  #ifndefFOO_API#defineFOO_API#endifFOO_APIintfoo();
                  FOO_APIintfoo_data;
                  FOO_APIvoid* (*foo_function_pointer)(intbar);
                  #if_MSC_VER#include<windows.h>BOOLWINAPIDllMain(HINSTANCEhinstDLL, DWORDfdwReason, LPVOIDlpvReserved)
                  {
                  return TRUE;
                  }
                  #endif

                  foo.c

                  #include"foo.h"intfoo() {
                  return7;
                  };
                  intfoo_data=8;
                  void* (*foo_function_pointer)(intbar) =0;

                  foo.hpp:

                  #ifndefFOO_API#defineFOO_API#endif#ifdef__cplusplusextern"C" {
                  #endifFOO_APIintfoo_cpp();
                  FOO_APIexternintfoo_cpp_data;
                  FOO_APIexternvoid* (*foo_cpp_function_pointer)(intbar);
                  #if_MSC_VER#include<windows.h>BOOLWINAPIDllMain(HINSTANCEhinstDLL, DWORDfdwReason, LPVOIDlpvReserved)
                  {
                  return TRUE;
                  }
                  #endif#ifdef__cplusplus
                  } /* extern "C" */#endif

                  foo.cpp

                  #include"foo.hpp"intfoo_cpp() {
                  return9;
                  };
                  intfoo_cpp_data=10;
                  void* (*foo_cpp_function_pointer)(intbar) =nullptr;

                  Produces this output with -gnu:

                  > zig build -Dtarget=x86_64-windows-gnu && zig-out\bin\dllimport.exe
                  foo() says: 7
                  foo_data is: u32@100000008
                  foo_function_pointer is: null
                  foo_cpp() says: 9
                  foo_cpp_data is: u32@10000000a
                  foo_cpp_function_pointer is: null
                  

                  But fails to link with -msvc:

                  >zig build -Dtarget=x86_64-windows-msvc && zig-out\bin\dllimport.exe
                  install
                  └─ install dllimport
                  └─ zig build-exe dllimport Debug x86_64-windows-msvc 4 errors
                  error: lld-link: undefined symbol: foo_data
                  note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:14
                  note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
                  error: lld-link: undefined symbol: foo_function_pointer
                  note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:15
                  note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
                  error: lld-link: undefined symbol: foo_cpp_data
                  note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:18
                  note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
                  error: lld-link: undefined symbol: foo_cpp_function_pointer
                  note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:19
                  note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
                  error: the following command failed with 4 compilation errors:
                  C:\cygwin64\home\kcbanner\kit\zig\build-stage3-release\bin\zig.exe build-exe c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\89dd1bf28160503a9c8636fb7182d3a2\foo_shared.lib c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\a55b9a2d906f932dd72ab4d979d22921\foo_cpp_shared.lib -ODebug -target x86_64-windows-msvc -mcpu baseline -I C:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\b4fda69f43e846a2309c0948ef9aabbc -I C:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\b4fda69f43e846a2309c0948ef9aabbc -Mroot=C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig -lc --cache-dir c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache --global-cache-dir e:\dev\zig-cache --name dllimport --zig-lib-dir C:\cygwin64\home\kcbanner\kit\zig\build-stage3-release\lib\zig\ --listen=-
                  Build Summary: 6/9 steps succeeded; 1 failed
                  

                  Note that only the data symbols are undefined. The functions link as expected.

                  Expected Behavior

                  Expected successful linking and matching output to -gnu.

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    bugObserved behavior contradicts documented or intended behavioros-windowsMicrosoft Windows

                    Type

                    No type

                    Projects

                    No projects

                      Milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Data symbols marked with `__declspec(dllexport)` do not link correctly to `extern var` when using the MSVC ABI · Issue #21749 · ziglang/zig · GitHub
                      Skip to content

                      Data symbols marked with __declspec(dllexport) do not link correctly to extern var when using the MSVC ABI #21749

                      Description

                      @kcbanner

                      Zig Version

                      0.14.0-dev.1951+857383689

                      Steps to Reproduce and Observed Behavior

                      extern fn can succesfully link with function symbols marked with __declspec(dllexport), it matches the behaviour as if __declspec(dllimport) had been used. This works on both -gnu and -msvc.

                      However, only with the -msvc ABI, extern var cannot link with data symbols marked with __declspec(dllexport).

                      Given this source and build script:

                      conststd=@import("std");
                      pubfnbuild(b: *std.Build) void {
                      consttarget=b.standardTargetOptions(.{});
                      constoptimize=b.standardOptimizeOption(.{});
                      constfoo_shared=b.addSharedLibrary(.{
                      .name="foo_shared",
                      .target=target,
                      .optimize=optimize,
                      });
                      foo_shared.defineCMacro("FOO_API", "__declspec(dllexport)");
                      foo_shared.addCSourceFile(.{ .file=b.path("src/foo.c"), .flags= &.{} });
                      foo_shared.linkLibC();
                      b.installArtifact(foo_shared);
                      constfoo_cpp_shared=b.addSharedLibrary(.{
                      .name="foo_cpp_shared",
                      .target=target,
                      .optimize=optimize,
                      });
                      foo_cpp_shared.defineCMacro("FOO_API", "__declspec(dllexport)");
                      foo_cpp_shared.addCSourceFile(.{ .file=b.path("src/foo.cpp"), .flags= &.{} });
                      if (target.result.abi==.msvc)
                      foo_cpp_shared.linkLibC()
                      elsefoo_cpp_shared.linkLibCpp();
                      b.installArtifact(foo_cpp_shared);
                      constexe=b.addExecutable(.{
                      .name="dllimport",
                      .root_source_file=b.path("src/main.zig"),
                      .target=target,
                      .optimize=optimize,
                      });
                      exe.linkLibrary(foo_shared);
                      exe.linkLibrary(foo_cpp_shared);
                      b.installArtifact(exe);
                      }

                      foo.h:

                      #ifndefFOO_API#defineFOO_API#endifFOO_APIintfoo();
                      FOO_APIintfoo_data;
                      FOO_APIvoid* (*foo_function_pointer)(intbar);
                      #if_MSC_VER#include<windows.h>BOOLWINAPIDllMain(HINSTANCEhinstDLL, DWORDfdwReason, LPVOIDlpvReserved)
                      {
                      return TRUE;
                      }
                      #endif

                      foo.c

                      #include"foo.h"intfoo() {
                      return7;
                      };
                      intfoo_data=8;
                      void* (*foo_function_pointer)(intbar) =0;

                      foo.hpp:

                      #ifndefFOO_API#defineFOO_API#endif#ifdef__cplusplusextern"C" {
                      #endifFOO_APIintfoo_cpp();
                      FOO_APIexternintfoo_cpp_data;
                      FOO_APIexternvoid* (*foo_cpp_function_pointer)(intbar);
                      #if_MSC_VER#include<windows.h>BOOLWINAPIDllMain(HINSTANCEhinstDLL, DWORDfdwReason, LPVOIDlpvReserved)
                      {
                      return TRUE;
                      }
                      #endif#ifdef__cplusplus
                      } /* extern "C" */#endif

                      foo.cpp

                      #include"foo.hpp"intfoo_cpp() {
                      return9;
                      };
                      intfoo_cpp_data=10;
                      void* (*foo_cpp_function_pointer)(intbar) =nullptr;

                      Produces this output with -gnu:

                      > zig build -Dtarget=x86_64-windows-gnu && zig-out\bin\dllimport.exe
                      foo() says: 7
                      foo_data is: u32@100000008
                      foo_function_pointer is: null
                      foo_cpp() says: 9
                      foo_cpp_data is: u32@10000000a
                      foo_cpp_function_pointer is: null
                      

                      But fails to link with -msvc:

                      >zig build -Dtarget=x86_64-windows-msvc && zig-out\bin\dllimport.exe
                      install
                      └─ install dllimport
                      └─ zig build-exe dllimport Debug x86_64-windows-msvc 4 errors
                      error: lld-link: undefined symbol: foo_data
                      note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:14
                      note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
                      error: lld-link: undefined symbol: foo_function_pointer
                      note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:15
                      note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
                      error: lld-link: undefined symbol: foo_cpp_data
                      note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:18
                      note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
                      error: lld-link: undefined symbol: foo_cpp_function_pointer
                      note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:19
                      note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
                      error: the following command failed with 4 compilation errors:
                      C:\cygwin64\home\kcbanner\kit\zig\build-stage3-release\bin\zig.exe build-exe c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\89dd1bf28160503a9c8636fb7182d3a2\foo_shared.lib c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\a55b9a2d906f932dd72ab4d979d22921\foo_cpp_shared.lib -ODebug -target x86_64-windows-msvc -mcpu baseline -I C:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\b4fda69f43e846a2309c0948ef9aabbc -I C:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\b4fda69f43e846a2309c0948ef9aabbc -Mroot=C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig -lc --cache-dir c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache --global-cache-dir e:\dev\zig-cache --name dllimport --zig-lib-dir C:\cygwin64\home\kcbanner\kit\zig\build-stage3-release\lib\zig\ --listen=-
                      Build Summary: 6/9 steps succeeded; 1 failed
                      

                      Note that only the data symbols are undefined. The functions link as expected.

                      Expected Behavior

                      Expected successful linking and matching output to -gnu.

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        bugObserved behavior contradicts documented or intended behavioros-windowsMicrosoft Windows

                        Type

                        No type

                        Projects

                        No projects

                          Milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Data symbols marked with `__declspec(dllexport)` do not link correctly to `extern var` when using the MSVC ABI · Issue #21749 · ziglang/zig · GitHub
                          Skip to content

                          Data symbols marked with __declspec(dllexport) do not link correctly to extern var when using the MSVC ABI #21749

                          Description

                          @kcbanner

                          Zig Version

                          0.14.0-dev.1951+857383689

                          Steps to Reproduce and Observed Behavior

                          extern fn can succesfully link with function symbols marked with __declspec(dllexport), it matches the behaviour as if __declspec(dllimport) had been used. This works on both -gnu and -msvc.

                          However, only with the -msvc ABI, extern var cannot link with data symbols marked with __declspec(dllexport).

                          Given this source and build script:

                          conststd=@import("std");
                          pubfnbuild(b: *std.Build) void {
                          consttarget=b.standardTargetOptions(.{});
                          constoptimize=b.standardOptimizeOption(.{});
                          constfoo_shared=b.addSharedLibrary(.{
                          .name="foo_shared",
                          .target=target,
                          .optimize=optimize,
                          });
                          foo_shared.defineCMacro("FOO_API", "__declspec(dllexport)");
                          foo_shared.addCSourceFile(.{ .file=b.path("src/foo.c"), .flags= &.{} });
                          foo_shared.linkLibC();
                          b.installArtifact(foo_shared);
                          constfoo_cpp_shared=b.addSharedLibrary(.{
                          .name="foo_cpp_shared",
                          .target=target,
                          .optimize=optimize,
                          });
                          foo_cpp_shared.defineCMacro("FOO_API", "__declspec(dllexport)");
                          foo_cpp_shared.addCSourceFile(.{ .file=b.path("src/foo.cpp"), .flags= &.{} });
                          if (target.result.abi==.msvc)
                          foo_cpp_shared.linkLibC()
                          elsefoo_cpp_shared.linkLibCpp();
                          b.installArtifact(foo_cpp_shared);
                          constexe=b.addExecutable(.{
                          .name="dllimport",
                          .root_source_file=b.path("src/main.zig"),
                          .target=target,
                          .optimize=optimize,
                          });
                          exe.linkLibrary(foo_shared);
                          exe.linkLibrary(foo_cpp_shared);
                          b.installArtifact(exe);
                          }

                          foo.h:

                          #ifndefFOO_API#defineFOO_API#endifFOO_APIintfoo();
                          FOO_APIintfoo_data;
                          FOO_APIvoid* (*foo_function_pointer)(intbar);
                          #if_MSC_VER#include<windows.h>BOOLWINAPIDllMain(HINSTANCEhinstDLL, DWORDfdwReason, LPVOIDlpvReserved)
                          {
                          return TRUE;
                          }
                          #endif

                          foo.c

                          #include"foo.h"intfoo() {
                          return7;
                          };
                          intfoo_data=8;
                          void* (*foo_function_pointer)(intbar) =0;

                          foo.hpp:

                          #ifndefFOO_API#defineFOO_API#endif#ifdef__cplusplusextern"C" {
                          #endifFOO_APIintfoo_cpp();
                          FOO_APIexternintfoo_cpp_data;
                          FOO_APIexternvoid* (*foo_cpp_function_pointer)(intbar);
                          #if_MSC_VER#include<windows.h>BOOLWINAPIDllMain(HINSTANCEhinstDLL, DWORDfdwReason, LPVOIDlpvReserved)
                          {
                          return TRUE;
                          }
                          #endif#ifdef__cplusplus
                          } /* extern "C" */#endif

                          foo.cpp

                          #include"foo.hpp"intfoo_cpp() {
                          return9;
                          };
                          intfoo_cpp_data=10;
                          void* (*foo_cpp_function_pointer)(intbar) =nullptr;

                          Produces this output with -gnu:

                          > zig build -Dtarget=x86_64-windows-gnu && zig-out\bin\dllimport.exe
                          foo() says: 7
                          foo_data is: u32@100000008
                          foo_function_pointer is: null
                          foo_cpp() says: 9
                          foo_cpp_data is: u32@10000000a
                          foo_cpp_function_pointer is: null
                          

                          But fails to link with -msvc:

                          >zig build -Dtarget=x86_64-windows-msvc && zig-out\bin\dllimport.exe
                          install
                          └─ install dllimport
                          └─ zig build-exe dllimport Debug x86_64-windows-msvc 4 errors
                          error: lld-link: undefined symbol: foo_data
                          note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:14
                          note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
                          error: lld-link: undefined symbol: foo_function_pointer
                          note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:15
                          note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
                          error: lld-link: undefined symbol: foo_cpp_data
                          note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:18
                          note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
                          error: lld-link: undefined symbol: foo_cpp_function_pointer
                          note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:19
                          note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
                          error: the following command failed with 4 compilation errors:
                          C:\cygwin64\home\kcbanner\kit\zig\build-stage3-release\bin\zig.exe build-exe c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\89dd1bf28160503a9c8636fb7182d3a2\foo_shared.lib c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\a55b9a2d906f932dd72ab4d979d22921\foo_cpp_shared.lib -ODebug -target x86_64-windows-msvc -mcpu baseline -I C:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\b4fda69f43e846a2309c0948ef9aabbc -I C:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\b4fda69f43e846a2309c0948ef9aabbc -Mroot=C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig -lc --cache-dir c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache --global-cache-dir e:\dev\zig-cache --name dllimport --zig-lib-dir C:\cygwin64\home\kcbanner\kit\zig\build-stage3-release\lib\zig\ --listen=-
                          Build Summary: 6/9 steps succeeded; 1 failed
                          

                          Note that only the data symbols are undefined. The functions link as expected.

                          Expected Behavior

                          Expected successful linking and matching output to -gnu.

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            bugObserved behavior contradicts documented or intended behavioros-windowsMicrosoft Windows

                            Type

                            No type

                            Projects

                            No projects

                              Milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Data symbols marked with `__declspec(dllexport)` do not link correctly to `extern var` when using the MSVC ABI · Issue #21749 · ziglang/zig · GitHub
                              Skip to content

                              Data symbols marked with __declspec(dllexport) do not link correctly to extern var when using the MSVC ABI #21749

                              Description

                              @kcbanner

                              Zig Version

                              0.14.0-dev.1951+857383689

                              Steps to Reproduce and Observed Behavior

                              extern fn can succesfully link with function symbols marked with __declspec(dllexport), it matches the behaviour as if __declspec(dllimport) had been used. This works on both -gnu and -msvc.

                              However, only with the -msvc ABI, extern var cannot link with data symbols marked with __declspec(dllexport).

                              Given this source and build script:

                              conststd=@import("std");
                              pubfnbuild(b: *std.Build) void {
                              consttarget=b.standardTargetOptions(.{});
                              constoptimize=b.standardOptimizeOption(.{});
                              constfoo_shared=b.addSharedLibrary(.{
                              .name="foo_shared",
                              .target=target,
                              .optimize=optimize,
                              });
                              foo_shared.defineCMacro("FOO_API", "__declspec(dllexport)");
                              foo_shared.addCSourceFile(.{ .file=b.path("src/foo.c"), .flags= &.{} });
                              foo_shared.linkLibC();
                              b.installArtifact(foo_shared);
                              constfoo_cpp_shared=b.addSharedLibrary(.{
                              .name="foo_cpp_shared",
                              .target=target,
                              .optimize=optimize,
                              });
                              foo_cpp_shared.defineCMacro("FOO_API", "__declspec(dllexport)");
                              foo_cpp_shared.addCSourceFile(.{ .file=b.path("src/foo.cpp"), .flags= &.{} });
                              if (target.result.abi==.msvc)
                              foo_cpp_shared.linkLibC()
                              elsefoo_cpp_shared.linkLibCpp();
                              b.installArtifact(foo_cpp_shared);
                              constexe=b.addExecutable(.{
                              .name="dllimport",
                              .root_source_file=b.path("src/main.zig"),
                              .target=target,
                              .optimize=optimize,
                              });
                              exe.linkLibrary(foo_shared);
                              exe.linkLibrary(foo_cpp_shared);
                              b.installArtifact(exe);
                              }

                              foo.h:

                              #ifndefFOO_API#defineFOO_API#endifFOO_APIintfoo();
                              FOO_APIintfoo_data;
                              FOO_APIvoid* (*foo_function_pointer)(intbar);
                              #if_MSC_VER#include<windows.h>BOOLWINAPIDllMain(HINSTANCEhinstDLL, DWORDfdwReason, LPVOIDlpvReserved)
                              {
                              return TRUE;
                              }
                              #endif

                              foo.c

                              #include"foo.h"intfoo() {
                              return7;
                              };
                              intfoo_data=8;
                              void* (*foo_function_pointer)(intbar) =0;

                              foo.hpp:

                              #ifndefFOO_API#defineFOO_API#endif#ifdef__cplusplusextern"C" {
                              #endifFOO_APIintfoo_cpp();
                              FOO_APIexternintfoo_cpp_data;
                              FOO_APIexternvoid* (*foo_cpp_function_pointer)(intbar);
                              #if_MSC_VER#include<windows.h>BOOLWINAPIDllMain(HINSTANCEhinstDLL, DWORDfdwReason, LPVOIDlpvReserved)
                              {
                              return TRUE;
                              }
                              #endif#ifdef__cplusplus
                              } /* extern "C" */#endif

                              foo.cpp

                              #include"foo.hpp"intfoo_cpp() {
                              return9;
                              };
                              intfoo_cpp_data=10;
                              void* (*foo_cpp_function_pointer)(intbar) =nullptr;

                              Produces this output with -gnu:

                              > zig build -Dtarget=x86_64-windows-gnu && zig-out\bin\dllimport.exe
                              foo() says: 7
                              foo_data is: u32@100000008
                              foo_function_pointer is: null
                              foo_cpp() says: 9
                              foo_cpp_data is: u32@10000000a
                              foo_cpp_function_pointer is: null
                              

                              But fails to link with -msvc:

                              >zig build -Dtarget=x86_64-windows-msvc && zig-out\bin\dllimport.exe
                              install
                              └─ install dllimport
                              └─ zig build-exe dllimport Debug x86_64-windows-msvc 4 errors
                              error: lld-link: undefined symbol: foo_data
                              note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:14
                              note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
                              error: lld-link: undefined symbol: foo_function_pointer
                              note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:15
                              note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
                              error: lld-link: undefined symbol: foo_cpp_data
                              note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:18
                              note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
                              error: lld-link: undefined symbol: foo_cpp_function_pointer
                              note: referenced by C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig:19
                              note: c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\d0aa5c5dc0e14955cec128eb46501ab6\dllimport.exe.obj:(main.main)
                              error: the following command failed with 4 compilation errors:
                              C:\cygwin64\home\kcbanner\kit\zig\build-stage3-release\bin\zig.exe build-exe c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\89dd1bf28160503a9c8636fb7182d3a2\foo_shared.lib c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\a55b9a2d906f932dd72ab4d979d22921\foo_cpp_shared.lib -ODebug -target x86_64-windows-msvc -mcpu baseline -I C:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\b4fda69f43e846a2309c0948ef9aabbc -I C:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache\o\b4fda69f43e846a2309c0948ef9aabbc -Mroot=C:\cygwin64\home\kcbanner\temp\dllimport\src\main.zig -lc --cache-dir c:\cygwin64\home\kcbanner\temp\dllimport\.zig-cache --global-cache-dir e:\dev\zig-cache --name dllimport --zig-lib-dir C:\cygwin64\home\kcbanner\kit\zig\build-stage3-release\lib\zig\ --listen=-
                              Build Summary: 6/9 steps succeeded; 1 failed
                              

                              Note that only the data symbols are undefined. The functions link as expected.

                              Expected Behavior

                              Expected successful linking and matching output to -gnu.

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                bugObserved behavior contradicts documented or intended behavioros-windowsMicrosoft Windows

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions