【问题标题】:How do you make clang link directly to a DLL in Windows without a .lib如何在没有 .lib 的情况下直接将 clang 链接到 Windows 中的 DLL
【发布时间】:2021-06-07 16:24:15
【问题描述】:

TinyCC 和 GCC 都支持 lib-less 链接,有一段时间支持直接链接到 DLL 文件(因为 lib 自 Win3.1 以来没有真正的用途)。但由于某些原因,在 Windows 中,Clang 坚持将 .dll 文件解释为 .lib 文件。根据 LLVM 的页面,在这里,https://lld.llvm.org/windows_support.htmllld-link 确实支持直接 dll 链接,但实际上,我没有看到任何指定的方法。 (LLVM 10.0 和 11.0 也是如此)

需要明确的是,我不是指使用 LoadLibraryGetProcAddress 手动加载。我指的是像这样调用编译器:

"C:\Program Files\mingw-w64\x86_64-8.1.0-win32-seh-rt_v6-rev0\mingw64\bin\gcc" -o rdtest.exe rdtest.c -lgdi32 -luser32 openvr_api.dll C:\windows\system32\opengl32.dll C:\windows\system32\msvcrt.dll

^^ 作品

"C:\Program Files\LLVM\bin\clang.exe" -fuse-ld=lld-link -v -o rdtest.exe rdtest.c -lgdi32 -luser32 openvr_api.dll C:\windows\system32\opengl32.dll C:\windows\system32\msvcrt.dll
[...]
1 warning generated.
 "C:\\Program Files\\LLVM\\bin\\lld-link" -out:rdtest.exe -defaultlib:libcmt "-libpath:C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Tools\\MSVC\\14.28.29333\\lib\\x64" "-libpath:C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Tools\\MSVC\\14.28.29333\\atlmfc\\lib\\x64" "-libpath:C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\ucrt\\x64" "-libpath:C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\um\\x64" -nologo "C:\\Users\\cnlohr\\AppData\\Local\\Temp\\rdtest-a9472b.o" gdi32.lib user32.lib openvr_api.dll "C:\\windows\\system32\\opengl32.dll" "C:\\windows\\system32\\msvcrt.dll"
lld-link: error: openvr_api.dll: bad file type. Did you specify a DLL instead of an import library?
lld-link: error: C:\windows\system32\opengl32.dll: bad file type. Did you specify a DLL instead of an import library?
lld-link: error: C:\windows\system32\msvcrt.dll: bad file type. Did you specify a DLL instead of an import library?
clang: error: linker command failed with exit code 1 (use -v to see invocation)

^^ 失败

【问题讨论】:

  • 自从 Win3.1 以来 lib 没有真正的用途你能详细说明一下吗?也许有一些引用?
  • “将 .dll 文件解释为 .lib 文件”,CLANG 或任何其他构建环境中的 lib 文件只是 .dll 文件中内容的映射.
  • 自 Windows 95 时代以来,DLL 已包含其内容的映射,因此,随着时间的推移,编译器只是直接链接到 DLL。不再明确需要 LIB 文件。它们很不错,因为它允许您在没有 DLL 的情况下进行链接,但仍然是可选的,不是必需的。
  • @CharlesLohr - 你写的绝对是错误的。 dll 仅包含导出函数的名称。 lib 可以并且通常包含更多信息。它为构建过程特别设计。在什么问题上使用 lib 文件?
  • 请注意,ClangCL / LLD-link 尝试与 MSVC 二进制和命令行兼容,这不是 MinGW 的目标之一。如果 MinGW 和 TinyCC 向 DLL 中添加了 link.exe 会拒绝的额外信息,我不会感到惊讶。

标签: c windows dll clang lib


【解决方案1】:

这是最近在上游实现的 https://reviews.llvm.org/rGa9ff1ce1b9a52add7557cf0579d424c9d0678860 并被反向移植到 MSYS2 llvm 包。

【讨论】:

    【解决方案2】:

    您误读了 LLVM 的文档。我相信您所指的部分是:

    链接到 DLL

    完成。 LLD 可以读取链接到 DLL 所需的导入库。支持按名称导出和按序号导出。

    它们与 MinGW / TinyCC 的“直接”(不是.lib)链接的含义不同。它们的字面意思是“LLD 可以链接到 Windows 上的共享库,并且能够读取 .lib 文件来这样做”。这是真的,但你仍然需要.lib,就像 MSVC 一样。

    所以答案是,很遗憾,在撰写本文时,您不能让 Clang/LLD 这样做

    【讨论】:

      猜你喜欢
      • 2017-02-08
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 2018-12-03
      • 2019-10-01
      相关资源
      最近更新 更多