假设我有这个 GHC 命令:
ghc -ibuild/foreign/somelib \
-lstdc++ \
-outputdir "$buildDir" \
foreign/somelib/somelib.o \
src/Main.hs -o "$buildDir/Main"
有点等效的
runGhc
命令是这样的,我认为:
runGhc (Just libdir) $ do
(setOutputFile (Just "build/Main") -> dflags) <- getSessionDynFlags
setSessionDynFlags $ dflags
{ importPaths = [".", "build/foreign/somelib"]
, ldInputs = [Option "-lstdc++"]
, libraryPaths = ["build/foreign/somelib"]
, objectDir = Just "build"
, hiDir = Just "build"
}
target <- guessTarget "src/Main.hs" Nothing Nothing
setTargets [target]
load LoadAllTargets
return ()
但是,这不包括目标文件,并且通过查看文档,我不确定如何添加它。把它当成目标好像不行。
正如评论中所建议的,解决方案是通过
ldInputs
:传递它
setSessionDynFlags $ dflags
{ importPaths = [".", "build/foreign/somelib"]
, ldInputs = [Option "foreign/somelib/somelib.o", Option "-lstdc++"]
, libraryPaths = ["build/foreign/somelib"]
, objectDir = Just "build"
, hiDir = Just "build"
}
就像使用
ld
时一样,定义 ldInputs
的顺序很重要。