【问题标题】:Statically link a haskell program that uses C++ wrapper library静态链接使用 C++ 包装库的 haskell 程序
【发布时间】:2014-04-19 20:50:45
【问题描述】:

我正在尝试通过一些第三方模块制作一个依赖于icu 库的程序。我怀疑依赖是通过Network.HTTP.Conduit,但可能是通过其他方式。动态链接的二进制文件即使在同一发行版的相邻版本之间也不能移植,因为 libicu* 的不同版本不兼容。

所以我正在尝试静态构建程序:

$ ghc --make -static -optc-static -optl-static my-prog.hs -optl-pthread

我遇到了很多此类错误:

/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

我相信我拥有所有相关库的静态版本(libiculibstdc++)。似乎链接器没有提供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

gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2

编辑: 我将问题缩小到包Data.Text.ICU,这里有一个不能内置到静态可执行文件中的短程序:

{-# LANGUAGE OverloadedStrings #-}
module Main where
import Data.Text.ICU
main = print $ toUpper Current "Hello!"

【问题讨论】:

    标签: haskell static-linking


    【解决方案1】:

    问题归结为 gcc 实际上没有 libstdc++ 或其他可用的核心 c++ 库,但 g++ 有。

    要求ghc 使用g++ 而不是gcc 进行链接应该可以解决问题。将以下内容添加到您的 cabal 文件中,作为 ghc-options 下的参数:-pgml g++。它将链接程序设置为g++,这应该允许系统链接器找到它需要的库。

    【讨论】:

    • 这就是诀窍! (它仍然对icu 没有帮助,因为它有更多未定义的引用,但同时我摆脱了icu 依赖项。
    猜你喜欢
    • 2013-09-03
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2013-08-26
    • 1970-01-01
    • 2013-10-04
    相关资源
    最近更新 更多