【问题标题】:Linking with C libraries on Windows with Dub在 Windows 上使用 Dub 链接 C 库
【发布时间】:2016-03-31 11:32:42
【问题描述】:

我正在尝试在 windows 上链接 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"

如果我尝试在 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,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 构建的。我有什么不同的做法?

【问题讨论】:

  • 尝试用dflags "-m64"dflags "-m32mscoff"编译它
  • -m32mscoff 会导致我的 D 代码出现大量链接器错误,-m64 会导致内部编译器错误。我猜这是因为 .lib 是为 32 位构建的。
  • 不,我刚刚还从 glfw 站点尝试了一个 64 位预构建的 .lib,我还收到了一个内部编译器错误。
  • 如果你得到一个 ICE(内部编译器错误),做一个最小化的测试用例(dustmite 可以帮助解决这个问题)并报告它!那不应该发生。

标签: windows d dub


【解决方案1】:

这里分三种情况:

  • 默认 32 位 Windows 版本。默认情况下,Windows 上的 dmd 使用旧的 OMF 链接器格式构建 32 位。您不能直接链接到 dll 并需要 .lib。但由于它使用旧格式,因此提供的大多数 .lib 文件都无法使用 - 您必须自己制作。

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

下载这个东西得到implib.exe:http://ftp.digitalmars.com/bup.zip 并使用它从 .dll 中创建一个 .lib:implib /s yourdll.lib yourdll.dll 并尝试与新的 lib 链接。 (就像你已经在做的那样将它添加到文件列表中)

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

到那时它应该可以工作了。

  • -m32mscoff 32 位版本。将该标志设置为 dmd,它将使用新的 COFF 格式而不是旧的 omf 格式输出 32 位程序。为了让它工作,你的路径中的link.exe 必须是来自 Visual Studio 的 Microsoft 链接器,而不是默认的 Digital Mars optlink.exe(令人困惑的是,直到最近它还被称为 link.exe。这很好Microsoft 的兼容替代品……二十年前……)。

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

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

  • -m64 64 位构建。与 mscoff 开关基本相同 - 您需要路径中的 Visual C++ 链接器 - 但使用 64 位而不是 32 位。当然,这也需要 64 位 dll 和 lib。

在 cmets 中,听起来您可能也遇到了一些错误,我不知道,以上是如果其他一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多