GHC 找不到适用于 mingw gcc(但不适用于 mingw-w64)的外部库(libjack.lib)
GHC can't find foreign library (libjack.lib) that works with mingw gcc (but not mingw-w64)
Objective:
我正在 Windows 10 上使用堆栈和 jack from hackage 的绑定编写 haskell 程序。 Jack 已安装,其 lib/include 路径已提供给 ghc。我的 objective 是使用堆栈构建程序。
问题:
当我运行stack build
时,我看到:
Building all executables for 'hsjack' once ...
Glasgow Haskell Compiler, Version 8.6.5, stage 2 booted by GHC version 8.6.2
Cabal-simple_Z6RU0evB_2.4.0.1_ghc-8.6.5.exe: Missing dependencies on foreign
libraries:
* Missing (or bad) C libraries: jack64, jack64 ...
While building package hsjack-0.1.0.0 using:
C:\sr\setup-exe-cache\x86_64-windows\Cabal-simple_Z6RU0evB_2.4.0.1_ghc-8.6.5.exe ...
--extra-include-dirs=C:\Users\jvall\Tools\jackpackage\includes ...
--extra-lib-dirs=C:\Users\jvall\Tools\jackpackage\lib...
Process exited with code: ExitFailure 1
我遗漏了一些无趣的部分(用“...”表示)。您可以看到包含库和包含文件的路径,我确信库(libjack.lib、libjack64.lib)和头文件都在这些目录中。我试过在 package.yaml 中的 extra-libraries:
下同时指定 - jack
和 - jack64
没有区别。当然,extra-include-dirs
和extra-lib-dirs
是在stack.yaml中指定的。
程序版本和其他上下文:
Windows 10
> jackd --version
jackdmp 1.9.11
我安装了 jack website.
上可用的 JACK2 64 位二进制文件
C:/.../jackpackage/includes/jack:
的内容
jack.h, 其他 *.h 文件
C:/../lib 的内容:
libjack.def、libjack.lib、libjack64.def、libjack64.lib。 (加上不相关的 libjackserver 文件。没有 .dll)
> 堆栈 --version
版本 2.3.1,Git 修订版 de2a7b694f07de7e6cf17f8c92338c16286b2878(8103 次提交)x86_64 hpack-0.33.0
> 堆栈执行 -- ghc --version
Glorious Glasgow Haskell 编译系统,版本 8.6.5
> 堆栈执行 -- gcc --version
realgcc.exe(Rev1,由 MSYS2 项目构建)7.2.0
使用mingw时
> gcc --version
gcc.exe(MinGW.org GCC Build-20200227-1)9.2.0
使用mingw-w64时
> gcc --version
gcc.exe(x86_64-posix-seh-rev0,由 MinGW-W64 项目构建)8.1.0
可能重复:
有很多类似的 SO 帖子,但我发现 none 为我的案例提供了解决方案。绝大多数只是缺少适当的库或程序 (1, 2, 3, 4)。我的问题似乎是由 *.lib 文件与 gcc 的 mingw-w64 和 MSYS2 版本不兼容引起的。
调试尝试:
为了验证 .lib 文件是否有效,我编写了一个使用它们的简单 C 程序。该程序在使用 mingw 提供的 gcc 时编译和 运行s 正确,但在使用 mingw-w64 gcc 或 stack exec gcc
时它不会 运行。使用 stack exec(粗略缩写)的示例输出:
stack exec -- gcc .\test.c -o .\test -I C:\...\includes -L C:\...\lib -ljack64
Target: x86_64-w64-mingw32
Thread model: posix
gcc version 7.2.0 (Rev1, Built by MSYS2 project)
...
path-to-stack//stack//x86_64-windows//ghc-8.8.3//mingw//bin/../lib/gcc/x86_64-w64-mingw32/7.2.0/collect2.exe .... -LC:\Users\jvall\Tools\jackpackage\lib ....
path-to-stack//stack//x86_64-windows//ghc-8.6.5//mingw//bin/ld.exe: cannot find -ljack64
collect2.exe: error: ld returned 1 exit status
mingw-w64 和 stack exec gcc
都以同样的方式失败。一切看起来都很好,直到他们找不到图书馆。使用 -m64/-m32 和 -ljack/-ljack64 不会改变任何东西。我知道 Jack2 库是用 C++ 编写的,并且读过 MSVC C++ 库与 mingw 不兼容,但这并不能解释 mingw-w64 不兼容时 mingw 是如何成功编译的。这是否相关,或者我应该关注这个问题的 haskell/stack 方面?
知道这里发生了什么吗?我如何使用 stack 来编译一个使用 jack 绑定的 haskell 程序?我试图做到彻底,但如果我遗漏了什么,请告诉我。对于 haskell 和重现此问题的 c 程序,我只有最少的示例,但问题已经很长了。
编辑: 该解决方案允许它编译,但在运行时会导致问题并且没有解决根本问题。请参阅已接受的答案以获得真正的解决方案。
更新:我找到了解决办法!一时兴起,我从 jack /lib/ 目录中的 .def 文件手动创建了 .dll 文件。最后它找到库并编译没有问题。这适用于 mingw-w64 甚至 stack build
。我运行的命令是
dlltool -d .\libjack64.def -l .\libjack64.dll
谁能解释为什么mingw 很高兴地链接到libjack.lib,但是用MSYS2 构建的mingw-w64 和gcc 找不到libjack64.lib? libjack64.dll 如何解决这个问题?
你的 binutils 太旧了。 GHC 8.6.5
附带的那个没有修复 https://sourceware.org/bugzilla/show_bug.cgi?id=22948。没有它 -ljack64
将找不到 libjack64.lib
但 -llibjack64
会。
Objective:
我正在 Windows 10 上使用堆栈和 jack from hackage 的绑定编写 haskell 程序。 Jack 已安装,其 lib/include 路径已提供给 ghc。我的 objective 是使用堆栈构建程序。
问题:
当我运行stack build
时,我看到:
Building all executables for 'hsjack' once ...
Glasgow Haskell Compiler, Version 8.6.5, stage 2 booted by GHC version 8.6.2
Cabal-simple_Z6RU0evB_2.4.0.1_ghc-8.6.5.exe: Missing dependencies on foreign
libraries:
* Missing (or bad) C libraries: jack64, jack64 ...
While building package hsjack-0.1.0.0 using:
C:\sr\setup-exe-cache\x86_64-windows\Cabal-simple_Z6RU0evB_2.4.0.1_ghc-8.6.5.exe ...
--extra-include-dirs=C:\Users\jvall\Tools\jackpackage\includes ...
--extra-lib-dirs=C:\Users\jvall\Tools\jackpackage\lib...
Process exited with code: ExitFailure 1
我遗漏了一些无趣的部分(用“...”表示)。您可以看到包含库和包含文件的路径,我确信库(libjack.lib、libjack64.lib)和头文件都在这些目录中。我试过在 package.yaml 中的 extra-libraries:
下同时指定 - jack
和 - jack64
没有区别。当然,extra-include-dirs
和extra-lib-dirs
是在stack.yaml中指定的。
程序版本和其他上下文:
Windows 10
> jackd --version
jackdmp 1.9.11
我安装了 jack website.
上可用的 JACK2 64 位二进制文件
C:/.../jackpackage/includes/jack:
的内容
jack.h, 其他 *.h 文件
C:/../lib 的内容:
libjack.def、libjack.lib、libjack64.def、libjack64.lib。 (加上不相关的 libjackserver 文件。没有 .dll)
> 堆栈 --version
版本 2.3.1,Git 修订版 de2a7b694f07de7e6cf17f8c92338c16286b2878(8103 次提交)x86_64 hpack-0.33.0
> 堆栈执行 -- ghc --version
Glorious Glasgow Haskell 编译系统,版本 8.6.5
> 堆栈执行 -- gcc --version
realgcc.exe(Rev1,由 MSYS2 项目构建)7.2.0
使用mingw时
> gcc --version
gcc.exe(MinGW.org GCC Build-20200227-1)9.2.0
使用mingw-w64时
> gcc --version
gcc.exe(x86_64-posix-seh-rev0,由 MinGW-W64 项目构建)8.1.0
可能重复:
有很多类似的 SO 帖子,但我发现 none 为我的案例提供了解决方案。绝大多数只是缺少适当的库或程序 (1, 2, 3, 4)。我的问题似乎是由 *.lib 文件与 gcc 的 mingw-w64 和 MSYS2 版本不兼容引起的。
调试尝试:
为了验证 .lib 文件是否有效,我编写了一个使用它们的简单 C 程序。该程序在使用 mingw 提供的 gcc 时编译和 运行s 正确,但在使用 mingw-w64 gcc 或 stack exec gcc
时它不会 运行。使用 stack exec(粗略缩写)的示例输出:
stack exec -- gcc .\test.c -o .\test -I C:\...\includes -L C:\...\lib -ljack64
Target: x86_64-w64-mingw32
Thread model: posix
gcc version 7.2.0 (Rev1, Built by MSYS2 project)
...
path-to-stack//stack//x86_64-windows//ghc-8.8.3//mingw//bin/../lib/gcc/x86_64-w64-mingw32/7.2.0/collect2.exe .... -LC:\Users\jvall\Tools\jackpackage\lib ....
path-to-stack//stack//x86_64-windows//ghc-8.6.5//mingw//bin/ld.exe: cannot find -ljack64
collect2.exe: error: ld returned 1 exit status
mingw-w64 和 stack exec gcc
都以同样的方式失败。一切看起来都很好,直到他们找不到图书馆。使用 -m64/-m32 和 -ljack/-ljack64 不会改变任何东西。我知道 Jack2 库是用 C++ 编写的,并且读过 MSVC C++ 库与 mingw 不兼容,但这并不能解释 mingw-w64 不兼容时 mingw 是如何成功编译的。这是否相关,或者我应该关注这个问题的 haskell/stack 方面?
知道这里发生了什么吗?我如何使用 stack 来编译一个使用 jack 绑定的 haskell 程序?我试图做到彻底,但如果我遗漏了什么,请告诉我。对于 haskell 和重现此问题的 c 程序,我只有最少的示例,但问题已经很长了。
编辑: 该解决方案允许它编译,但在运行时会导致问题并且没有解决根本问题。请参阅已接受的答案以获得真正的解决方案。
更新:我找到了解决办法!一时兴起,我从 jack /lib/ 目录中的 .def 文件手动创建了 .dll 文件。最后它找到库并编译没有问题。这适用于 mingw-w64 甚至 stack build
。我运行的命令是
dlltool -d .\libjack64.def -l .\libjack64.dll
谁能解释为什么mingw 很高兴地链接到libjack.lib,但是用MSYS2 构建的mingw-w64 和gcc 找不到libjack64.lib? libjack64.dll 如何解决这个问题?
你的 binutils 太旧了。 GHC 8.6.5
附带的那个没有修复 https://sourceware.org/bugzilla/show_bug.cgi?id=22948。没有它 -ljack64
将找不到 libjack64.lib
但 -llibjack64
会。