使用 Dub 链接 Windows 上的 C 库

Linking with C libraries on Windows with Dub

我正尝试在 windows 上 link glfw。

在 Linux 上相当简单:

dependency "derelict-glfw3" version="~>2.0.0"
subConfiguration "derelict-glfw3" "derelict-glfw3-static"

sourceFiles "deps/glfw/build/src/libglfw3.a" platform="posix"
libs"Xi" "pthread" "X11" "Xxf86vm" "Xrandr" "pthread" "GL" "GLU" "Xinerama" "Xcursor" platform="posix"

如果我尝试 link 使用 windows 上的 .dll,dub 告诉我 Error: unrecognized file extension dll.

dependency "derelict-glfw3" version="~>2.0.0"
subConfiguration "derelict-glfw3" "derelict-glfw3-static"

sourceFiles "deps\glfw\build\src\Debug\glfw3.dll" platform="windows"

如果我尝试使用 .lib link,dub 告诉我 COFF is not supported.

dependency "derelict-glfw3" version="~>2.0.0"
subConfiguration "derelict-glfw3" "derelict-glfw3-static"

sourceFiles "deps\glfw\build\src\Debug\glfw3.lib" platform="windows"

GLFW 是用 vs2013 构建的。我需要做哪些不同的事情?

这里有三种情况:

  • 默认 32 位 Windows 构建。默认情况下,Windows 上的 dmd 使用旧的 OMF linker 格式构建 32 位。您不能 link 直接访问 dll 而需要 .lib。但由于它使用旧格式,提供的大多数 .libs 都不起作用 - 你必须自己制作。

(哈哈,我想要这个在列表项中,但降价很烂。随便)

下载这个东西得到implib.exe:http://ftp.digitalmars.com/bup.zip 并使用它从 .dll 生成 .lib:implib /s yourdll.lib yourdll.dll 并尝试 link 使用新的 lib。 (将其添加到文件列表中,就像您已经在做的那样)

如果它不起作用,请再次尝试该命令,但这次没有 /s 开关。

到时候应该可以了。

  • -m32mscoff 32 位版本。使用 dmd 的标志,它将使用新的 COFF 格式而不是旧的 omf 格式输出 32 位程序。要使其正常工作,您路径中的 link.exe 必须是来自 Visual Studio 的 Microsoft linker,而不是默认的 Digital Mars optlink.exe(令人困惑的是,它也被称为link.exe 直到最近。当它是 Microsoft 的兼容替代品时,那真是太好了……二十年前……)。

无论如何,如果您安装了 Microsoft C++ 编译器和 linker 并将 link.exe 放在您的路径中,dmd -m32mscoff 应该可以使用现有的 .lib 文件dll。

提示:如果您使用了 dmd 的 Windows 安装程序,请从开始菜单中打开 "D2 64 bit command prompt" 以设置路径。它会告诉您使用 -m64,但您也可以在该环境中使用 -m32mscoff,它应该可以工作。如果一切安装正确。

  • -m64 64 位版本。基本上与 mscoff 开关相同 - 你需要 Visual C++ linker 在你的路径中 - 但是是 64 位而不是 32 位。当然,这也需要 64 位 dll 和 lib。

在评论中,听起来您可能还面临一些错误,我不知道,以上是如果其他一切正常。