【发布时间】: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.html、lld-link 确实支持直接 dll 链接,但实际上,我没有看到任何指定的方法。 (LLVM 10.0 和 11.0 也是如此)
需要明确的是,我不是指使用 LoadLibrary 和 GetProcAddress 手动加载。我指的是像这样调用编译器:
"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会拒绝的额外信息,我不会感到惊讶。