Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Dub在Windows上链接C库_Windows_D_Dub - Fatal编程技术网

使用Dub在Windows上链接C库

使用Dub在Windows上链接C库,windows,d,dub,Windows,D,Dub,我正在尝试在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"

我正在尝试在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会告诉我
错误:无法识别的文件扩展名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

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链接器格式生成32位。不能直接链接到dll,需要.lib。但是由于它使用的是旧格式,所以提供的大多数.lib都不起作用-您必须自己制作
(哈哈,我想把这个放在列表项中,但降价太糟糕了。随便什么)

下载此内容以获取implib.exe: 然后用它从.dll中生成一个.lib:
implib/s yourdll.lib yourdll.dll
,并尝试与新库链接。(将其添加到文件列表中,就像您已经在做的那样)

如果不起作用,请重试该命令,但这次不使用
/s
开关

到那时它应该可以工作了

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

无论如何,如果你安装了微软C++编译器和链接器,并将Link .EXE放在你的路径中,<代码> DMD -M32 MSCOFF< <代码>应该使用DLL中的现有<代码> .LIB < /C>文件。 提示:如果使用Windows installer for dmd,请从“开始”菜单打开“D2 64位命令提示符”以设置路径。它会告诉您使用

-m64
,但您也可以在该环境中使用
-m32mscoff
,它应该可以工作。如果一切都安装正确

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


在评论中,听起来您可能也遇到了一些bug,我不知道这一点,以上是其他一切是否正常工作。

尝试使用
dflags“-m64”
dflags“-m32mscoff”编译它
-m32mscoff
将导致my D代码的大量链接器错误,
-m64
将导致内部编译器错误。我想这是因为.lib是为32位而构建的。不,我只是尝试了从glfw站点预构建的64位.lib,我还得到了一个内部编译器错误。如果你得到一个ICE(内部编译器错误),制作一个最小化的测试用例(dustmite可以帮助),并报告它!这永远不应该发生。