我正在尝试使用GHC为一个用Haskell编写的基于CGI的web应用程序构建一个静态二进制文件,并将其部署到共享服务器上。
我想使用this answer提到的musl。
不幸的是,这并不是一件容易的事情:
$ ghc -static -optl-static -pgmc musl-gcc -pgml musl-gcc -L/usr/local/lib app.hs
[1 of 1] Compiling Main ( app.hs, app.o )
Linking app...
/usr/lib/ghc-7.6.3/libHSrts.a(Itimer.o): In function `exitTicker':
(.text+0x1af): undefined reference to `__sysv_signal'
collect2: error: ld returned 1 exit status我做错了什么?(完整免责声明:我是Haskell新手(:)
我使用的是Arch Linux、GHC7.6.3和Network.CGI。
发布于 2014-04-08 04:20:12
看起来您的Haskell运行时是针对glibc编译的,但您正在尝试针对musl编译您的Haskell源代码。通常,您不能在同一个程序中混合使用两个C库。
您在这里遇到的具体问题是,glibc支持两组不同的、相互冲突的signal函数语义,以匹配不同的UNIX历史版本所提供的语义。它根据您的C代码定义的功能测试宏来选择要使用的版本。为了在它们之间进行真正的切换,它使用C预处理器将您的程序对signal的引用替换为对具有您所请求的语义的函数版本的引用(在本例中,您的Haskell运行时具有对__sysv_signal的引用)。
问题是musl不会做同样的微不足道的事情。它公开了一个与POSIX标准定义的语义相匹配的signal版本,并以signal的名称公开了它。
解决这个问题的正确方法是根据musl的头文件重新编译Haskell运行时。我不知道是否有人真的尝试过这样做,所以YMMV。
请注意,您应该避免将库安装在相同的系统目录中,而不是针对不同的C库进行编译。这样做可能会造成破坏,因为任何试图使用针对冲突的C库编译的多个库的软件都会遇到与您现在遇到的问题完全不同的问题。一般情况下,您应该将musl编译并安装到它自己的前缀中,然后编译其他库(例如,您的Haskell运行时)并安装到相同的前缀中。这样,您的musl和glibc库就完全分开了。
https://stackoverflow.com/questions/22880650
复制相似问题