GHC API 相当于将 C/C++ 文件/对象添加到编译中

问题描述 投票:0回答:1

假设我有这个 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 ()

但是,这不包括目标文件,并且通过查看文档,我不确定如何添加它。把它当成目标好像不行。

haskell ghc ghc-api
1个回答
0
投票

正如评论中所建议的,解决方案是通过

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
的顺序很重要。

© www.soinside.com 2019 - 2024. All rights reserved.