在OSX上,GHCi与交叉调用dynlib的链接失败

时间:2016-06-09 10:41:52

标签: macos haskell shared-libraries ghc haskell-stack

设置

编译:GHC 7.10.3

我必须使用两个动态库(libpetsclibslepc),其中一个使用另一个的函数。链接我的应用程序时,我遇到以下错误,它提到了一个这样的符号(KSPConvergedReasons)。 NB。我自己的代码不使用此符号。

user specified .o/.so/.DLL could not be loaded
(dlopen($SLEPC_DIR/arch-darwin-c-debug/lib/libslepc.dylib, 5): Symbol
not found: _KSPConvergedReasons
  Referenced from: $SLEPC_DIR/arch-darwin-c-debug/lib/libslepc.dylib
  Expected in: flat namespace
 in $SLEPC_DIR/arch-darwin-c-debug/lib/libslepc.dylib)

当然,nm -u显示_KSPConvergedReasons为未定义 符号(见下文)。 自从我第一次编译以来,我不明白这种行为的原因 使用所有相关的PETSc和SLEPc标头并链接两者 .dylibs。

注意:

有问题的符号(KSPConvergedReasons)确实存在于被调用者库(libpetsc)中:

$ nm ${PETSC_DIR}/${PETSC_ARCH}/lib/libpetsc.3.7.2.dylib | grep KSPConv
000000000110a652 T _KSPConvergedDefault
0000000001109703 T _KSPConvergedDefaultCreate
000000000110b934 T _KSPConvergedDefaultDestroy
0000000001109a96 T _KSPConvergedDefaultSetUIRNorm
000000000110a074 T _KSPConvergedDefaultSetUMIRNorm
000000000106533d T _KSPConvergedLSQR
0000000001743280 D _KSPConvergedReasons
...

构建+链接序列

构建从我自己的库生成的C代码,该代码又使用上述两个库中的头文件:

gcc -c -g -w ${SRCDIR}/Internal/InlineC.c -o ${LIBDIR}/InlineC_c.o -I${PETSC_DIR_ARCH}/include -I${PETSC_DIR}/include -I${SLEPC_DIR_ARCH}/include -I${SLEPC_DIR}/include

链接:

stack exec ghci ${SRCDIR}/Spec.hs ${SRCDIR}/Internal/InlineC.hs  ${LIBDIR}/InlineC_c.o  -- -isrc/ -L${PETSC_DIR_ARCH}/lib -L${SLEPC_DIR_ARCH}/lib -lpetsc -lmpich -lslepc

问题

为什么会发生这种情况?我该如何解决这个问题?

提前感谢您的任何指示, 马可

调用dynlib中的未定义符号:

$ nm -u libslepc.3.7.1.dylib | grep KSP

_KSPAppendOptionsPrefix
_KSPConvergedReasons
...

0 个答案:

没有答案