Я выясняю, как работает haskell-mpi, переписывая привязку. Я пытаюсь повторно использовать установку MPICH, которая была настроена путем установки PETSc (который работает нормально). Вопрос: make main
дает мне правильный модуль в GHCi, но когда я прошу вычислить commWorld, компоновщик жалуется, что он не может найти символ MPI_COMM_WORLD (который, однако, входит в объем файла makefile).Ошибка компоновщика GHCi с FFI-импортированными константами MPI (через c2hs)
Что я делаю неправильно? Заранее спасибо
ошибка:
ByteCodeLink: can't find label
During interactive linking, GHCi couldn't find the following symbol:
MPI_COMM_WORLD
Main.chs:
type MPIComm = {# type MPI_Comm #}
newtype Comm = MkComm { fromComm :: MPIComm } deriving (Eq, Show)
foreign import ccall "&MPI_COMM_WORLD" commWorld_ :: Ptr MPIComm
foreign import ccall "&MPI_COMM_SELF" commSelf_ :: Ptr MPIComm
commWorld, commSelf :: Comm
commWorld = MkComm <$> unsafePerformIO $ peek commWorld_
commSelf = MkComm <$> unsafePerformIO $ peek commSelf_
Makefile:
PETSC_DIR_ARCH = ${PETSC_DIR}/arch-darwin-c-debug
PETSC_DIR_ARCH_INCLUDE = ${PETSC_DIR_ARCH}/include
main :
c2hs Main.chs -C -I${PETSC_DIR_ARCH}/include -C -I${PETSC_DIR}/include
ghci Main.hs -L${PETSC_DIR_ARCH}/lib -lpetsc -lmpich
mpi.h
typedef int MPI_Comm;
#define MPI_COMM_WORLD ((MPI_Comm)0x44000000)
#define MPI_COMM_SELF ((MPI_Comm)0x44000001)
Я думаю о макросе {# enum ... #}. Однако вышеприведенное определение взято из исходной библиотеки привязки. Однако я не уверен, потому что я не могу получить 'haskell-mpi', чтобы правильно строить. Спасибо, что сейчас – ocramz
'haskell-mpi' делает то же, что и я предложил, см. Файл' src/cbits/constants.c'. –
'src/cbits/constants.c' начинается: #define MPI_CONST (ty, name, defn) ty name = defn; MPI_CONST (MPI_Datatype, mpi_char, MPI_CHAR) MPI_CONST (MPI_Datatype, mpi_wchar, MPI_WCHAR) ... #define является функцией макро и все последующие строки are..concrete типы? – ocramz