编译:GHC 7.10.3
我必须使用两个动态库(libpetsc
和libslepc
),其中一个使用另一个的函数。链接我的应用程序时,我遇到以下错误,它提到了一个这样的符号(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
...