Как мне скомпилировать исполняемый файл Haskell (не библиотека), используя GHC> = 8.2.1 (предпочтительно на 8.6. *) В macOS 10.14.5, которая успешно выполняет foreign export
sa функцию (т.е. предоставляет это как публичный символ в двоичном коде)? Это работает в GHC 8.0.2, но не в более поздних версиях.
Я пробовал это на ghc 8.0.2 (через стек), 8.2.2 (через nix и стек), 8.4.4 (через nix и стек) и 8.6.4 (через nix и стек) ). Работает только 8.0.2. Я знаю, что 8.2 ввел это изменение: GHC will now use ld.gold or ld.lld instead of the system’s default
ld , if available.
Но мне неясно, будет ли 8.0.2 использовать другой «системный по умолчанию» ld, в первую очередь (ld Дарвина, в отличие от lvm lld?). Мне известна опция -pgml [ld-program-here]
в ghc для установки компоновщика, но я не смог вручную установить для него что-либо, что было успешно скомпилировано и связало что-либо для дальнейшего тестирования.
У меня есть этот файл Main.hs
:
module Main where
import Foreign.C
foreign export ccall "my_square" my_square :: CInt -> CInt
my_square :: CInt -> CInt
my_square x = x * x
main :: IO ()
main = putStrLn "FFI Test"
С ghc 8.0.2:
> rm Main.hi Main.o && ghc-8.0.2 Main.hs && nm -g Main | grep my_square
[1 of 1] Compiling Main ( Main.hs, Main.o )
[some apparently unrelated clang warnings]
Linking Main ...
[further clang warnings]
2544:0000000100001260 T _my_square
В ghc 8.6.4 символ, кажется, не экспортируется, поэтому будущие попытки связать другую программу с этим символом не удаются.
> rm Main.hi Main.o && ghc-8.6.4 Main.hs && nm -g Main | grep my_square
[1 of 1] Compiling Main ( Main.hs, Main.o )
Linking Main ...