繁体   English   中英

GHC 找不到与 mingw gcc(但不是 mingw-w64)一起使用的外部库(libjack.lib)

[英]GHC can't find foreign library (libjack.lib) that works with mingw gcc (but not mingw-w64)

客观的:

我正在 Windows 10 上编写一个 haskell 程序,使用 stack 和来自hackagejack绑定。 安装了 Jack,并将其 lib/include 路径提供给 ghc。 我的目标是使用堆栈构建程序。

问题:

当我运行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)和 header 文件在这些目录中。 我尝试在额外库下同时指定- jack- jack64 extra-libraries:在 package.yaml 中没有区别。 当然,在stack.yaml中指定了extra-include-dirsextra-lib-dirs

程序版本和其他上下文:

Windows 10

> jackd--版本
jackdmp 1.9.11
我安装了jack 网站上提供的 JACK2 64 位二进制文件。
C 的内容:/.../jackpackage/includes/jack:
jack.h,其他 *.h 文件
C:/../lib的内容:
libjack.def、libjack.lib、libjack64.def、libjack64.lib。 (加上无关的 libjackserver 文件。没有.dll)

> 堆栈--版本
版本 2.3.1,Git 修订版 de2a7b694f07de7e6cf17f8c92338c16286b2878(8103 次提交)x86_64 hpack-0.33.0

> 堆栈 exec -- ghc --version
Glorious Glasgow Haskell 编译系统,版本 8.6.5

> 堆栈执行--gcc --version
realgcc.exe(Rev1,由 MSYS2 项目构建)7.2.0

使用mingw时
> gcc --版本
gcc.exe(MinGW.org GCC Build-20200227-1)9.2.0

使用 mingw-w64 时
> gcc --版本
gcc.exe(x86_64-posix-seh-rev0,由 MinGW-W64 项目构建)8.1.0

可能的重复:

有许多类似的 SO 帖子,但我发现没有一个为我的案例提供解决方案。 绝大多数只是缺少适当的库或程序( 1234 )。 我的问题似乎是由 *.lib 文件与 gcc 的 mingw-w64 和 MSYS2 版本之间的不兼容引起的。

调试尝试:

为了验证.lib 文件是否可以正常工作,我编写了一个简单的 c 程序来使用它们。 程序在使用mingw提供的gcc时编译运行正常,但使用mingw-w64 gcc或stack exec gcc时无法运行。 示例 output 使用 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 如何在 mingw-w64 不兼容时成功编译。 这些是否相关,或者我应该关注这个问题的haskell/stack方面吗?

有什么想法吗? 如何使用堆栈来编译使用插孔绑定的 haskell 程序? 我试图做到彻底,但如果我遗漏了什么,请告诉我。 对于 haskell 和 c 程序,我有最小的例子来重现这个,但问题已经很长了。

你的 binutils 是旧的。 GHC 8.6.5附带的那个错过了这个修复https://sourceware.org/bugzilla/show_bug.cgi?id=22948 。没有它-ljack64不会找到libjack64.lib-llibjack64会。

编辑:这个解决方案允许它编译,但在运行时会导致问题并且没有解决潜在的问题。 有关真正的解决方案,请参阅公认的答案。

更新:我找到了解决方案。 一时兴起,我从 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 如何解决这个问题?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM