使用Dub在Windows上链接C库
我正在尝试在windows上链接glfw 在Linux上,这相当简单:使用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"
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/s yourdll.lib yourdll.dll
,并尝试与新库链接。(将其添加到文件列表中,就像您已经在做的那样)
如果不起作用,请重试该命令,但这次不使用/s
开关
到那时它应该可以工作了
32位构建。使用该标志到dmd,它将使用新的COFF格式而不是旧的omf格式输出32位程序。要使其工作,路径中的-m32mscoff
必须是Visual Studio中的Microsoft链接器,而不是默认的Digital Mars optlink.exe(令人困惑的是,直到最近它还被称为link.exe
。当它是Microsoft的兼容替代品时,这很好……二十年前……)link.exe
无论如何,如果你安装了微软C++编译器和链接器,并将Link .EXE放在你的路径中,<代码> DMD -M32 MSCOFF< <代码>应该使用DLL中的现有<代码> .LIB < /C>文件。 提示:如果使用Windows installer for dmd,请从“开始”菜单打开“D2 64位命令提示符”以设置路径。它会告诉您使用
-m64
,但您也可以在该环境中使用-m32mscoff
,它应该可以工作。如果一切都安装正确
64位版本。基本上与MSCOFF开关相同——在路径中需要Visual C++链接器——但是64位而不是32位。当然,这也需要64位dll和lib-m64
在评论中,听起来您可能也遇到了一些bug,我不知道这一点,以上是其他一切是否正常工作。尝试使用
dflags“-m64”
或dflags“-m32mscoff”编译它
-m32mscoff
将导致my D代码的大量链接器错误,-m64
将导致内部编译器错误。我想这是因为.lib是为32位而构建的。不,我只是尝试了从glfw站点预构建的64位.lib,我还得到了一个内部编译器错误。如果你得到一个ICE(内部编译器错误),制作一个最小化的测试用例(dustmite可以帮助),并报告它!这永远不应该发生。