我的链接命令是:
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
库更早,所以我不确定为什么我得到未定义的引用。
答案 0 :(得分:0)
我愚蠢而且错过了显而易见的事情:尝试修复gcc打印的第一个错误。
我设法从我的cabal包中的导出模块中删除test
功能。重新构建将test
添加到.so
的cabal包后,所有链接错误都消失了。