将cabalized Haskell包链接到C程序(未定义的引用链接器错误)

时间:2015-08-20 19:09:59

标签: haskell gcc linker

我的链接命令是:

gcc -O2 -m32 -o ParseInt.exe ParseInt.o hsbracket.o \
    -L../../dist/ia32/build -lffi -lHSarray-0.5.0.0-ghc7.8.3 \
    -lHSbin-package-db-0.0.0.0-ghc7.8.3 -lHSbinary-0.7.1.0-ghc7.8.3 \
    -lHSbytestring-0.10.4.0-ghc7.8.3 -lHSCabal-1.18.1.3-ghc7.8.3 \
    -lHScontainers-0.5.5.1-ghc7.8.3 -lHSdeepseq-1.3.0.2-ghc7.8.3 \
    -lHSdirectory-1.2.1.0-ghc7.8.3 -lHSfilepath-1.3.0.2-ghc7.8.3 \
    -lHSghc-7.8.3-ghc7.8.3 -lHSghc-prim-0.3.1.0-ghc7.8.3 \
    -lHShaskeline-0.7.1.2-ghc7.8.3 -lHShaskell2010-1.1.2.0-ghc7.8.3 \
    -lHShaskell98-2.0.0.3-ghc7.8.3 -lHShoopl-3.10.0.1-ghc7.8.3 \
    -lHShpc-0.6.0.1-ghc7.8.3 -lHSinteger-gmp-0.5.1.0-ghc7.8.3 \
    -lHSold-locale-1.0.0.6-ghc7.8.3 -lHSold-time-1.1.0.2-ghc7.8.3 \
    -lHSpads-haskell-1.1-ghc7.8.3 -lHSpretty-1.1.1.1-ghc7.8.3 \
    -lHSprocess-1.2.0.0-ghc7.8.3 -lHSrts-ghc7.8.3 \
    -lHSrts_debug-ghc7.8.3 -lHSrts_l-ghc7.8.3 -lHSrts_thr-ghc7.8.3 \
    -lHSrts_thr_debug-ghc7.8.3 -lHSrts_thr_l-ghc7.8.3 \
    -lHStemplate-haskell-2.9.0.0-ghc7.8.3 -lHSterminfo-0.4.0.0-ghc7.8.3 \
    -lHStime-1.4.2-ghc7.8.3 -lHStransformers-0.3.0.0-ghc7.8.3 \
    -lHSunix-2.7.0.1-ghc7.8.3 -lHSxhtml-3000.2.1-ghc7.8.3 \
    -lHSbase-4.7.0.1-ghc7.8.3  -Wl,-melf_i386

我得到了一堆错误,如:

ParseInt.o: In function `main':
ParseInt.c:(.text.startup+0x16): undefined reference to `test'
../../dist/ia32/build/libHSrts-ghc7.8.3.so: undefined reference to `base_GHCziWord_W16zh_con_info'
../../dist/ia32/build/libHSrts-ghc7.8.3.so: undefined reference to `base_GHCziConcziSync_runSparks_closure'
../../dist/ia32/build/libHSrts-ghc7.8.3.so: undefined reference to `base_ControlziExceptionziBase_nonTermination_closure'

但未定义的引用是在我链接的基础.so中定义的:

$ nm ../../dist/ia32/build/libHSbase-4.7.0.1-ghc7.8.3.so | grep base_GHCziWord_W16zh_con_info
26690:00550884 T base_GHCziWord_W16zh_con_info
$ nm ../../dist/ia32/build/libHSrts-ghc7.8.3.so | grep base_GHCziWord_W16zh_con_info
104:         U base_GHCziWord_W16zh_con_info

那么为什么libHSrts看不到libHSbase中定义的内容呢?我按照这里的指示:http://www.vex.net/~trebla/haskell/so.xhtml,并且ParseInt.exe在某一时刻正确链接但后来我在cabal包中添加了一些库/写了更多Haskell代码(ParseInt.c和{ {1}}没有改变。)

我已经阅读了链接顺序(https://stackoverflow.com/a/409470/1542000),hsbracket.c在链接命令中比它依赖的rts库更早,所以我不确定为什么我得到未定义的引用。

1 个答案:

答案 0 :(得分:0)

我愚蠢而且错过了显而易见的事情:尝试修复gcc打印的第一个错误。

我设法从我的cabal包中的导出模块中删除test功能。重新构建将test添加到.so的cabal包后,所有链接错误都消失了。