cro*_*ser 6 haskell static-linking
我试图制作一个程序,通过一些第三方模块,依赖于icu
库.我怀疑依赖是通过Network.HTTP.Conduit
但可能通过其他东西.动态链接的二进制文件即使在相同发行版的相邻版本之间也不可移植,因为libicu*具有不兼容的不同版本.
所以我试图静态地构建程序:
$ ghc --make -static -optc-static -optl-static my-prog.hs -optl-pthread
Run Code Online (Sandbox Code Playgroud)
我收到了很多这样的错误:
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libicuuc.a(dictionarydata.ao):(.data.rel.ro._ZTIN6icu_5222BytesDictionaryMatcherE[_ZTIN6icu_5222BytesDictionaryMatcherE]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libicuuc.a(dictionarydata.ao):(.data.rel.ro._ZTVN6icu_5217DictionaryMatcherE[_ZTVN6icu_5217DictionaryMatcherE]+0x28): undefined reference to `__cxa_pure_virtual'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我相信我有所有涉及的库的静态版本(libicu
,libstdc++
).似乎连接器没有提供libstdc++
(或者是它libitl
?显然在后者中定义了有问题的功能).
我尝试添加选项-optl-static-libstdc++
,-optl-lstdc++
并-optl-litm
在命令行的末尾无济于事.
静态链接间接依赖于C++支持函数的haskell程序的过程是什么?我在跑步
The Glorious Glasgow Haskell Compilation System, version 7.6.3
gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
Run Code Online (Sandbox Code Playgroud)
要么
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Run Code Online (Sandbox Code Playgroud)
编辑:
我将问题缩小到包Data.Text.ICU
,这是一个无法构建到静态可执行文件中的简短程序:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Data.Text.ICU
main = print $ toUpper Current "Hello!"
Run Code Online (Sandbox Code Playgroud)
问题归结为这样一个事实:gcc
实际上并没有 libstdc++ 或可用的其他核心 C++ 库,但g++
确实有。
要求ghc
使用g++
而不是gcc
链接应该可以解决问题。将以下内容添加到您的 cabal 文件中作为 ghc-options 下的参数:-pgml g++
。它将链接程序设置为g++
允许系统链接器找到它需要的库。