Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用haskell shake构建工具。使用本地静态c库_Haskell_Shake - Fatal编程技术网

使用haskell shake构建工具。使用本地静态c库

使用haskell shake构建工具。使用本地静态c库,haskell,shake,Haskell,Shake,在一个shake c项目中,我创建了一个名为libbuild3a.a的静态库 我想通过在源文件中直接提供它,在一个单独的shake c项目中使用它。当它试图编译main.c时,我得到了以下错误,它将是exe 命令行:gcc-csrc3b/main.c-Lsrc3b/lib-lbuild3a-obuild3b/src3b/main.o-MMD-mfbuild3b/src3b/main.m 退出代码:1 标准: src3b/main.c:2:10:致命错误:add.h:没有这样的文件或目录 #包括

在一个shake c项目中,我创建了一个名为libbuild3a.a的静态库

我想通过在源文件中直接提供它,在一个单独的shake c项目中使用它。当它试图编译main.c时,我得到了以下错误,它将是exe

命令行:gcc-csrc3b/main.c-Lsrc3b/lib-lbuild3a-obuild3b/src3b/main.o-MMD-mfbuild3b/src3b/main.m 退出代码:1 标准: src3b/main.c:2:10:致命错误:add.h:没有这样的文件或目录 #包括

这是shake项目。这是一个用haskell ffi调用c的测试项目

build3b :: IO ()
build3b = shakeArgs shakeOptions{shakeFiles="build3b"} $ do
  let
    buildDir = "build3b"
    srcDir = "src3b"
  want [buildDir </> "run3b" <.> exe]

  buildDir </> "run3b" <.> exe %> \out -> do
        putInfo "============== entering exe creation ====================="

        --Do I need to load the static library?
        cs_main <- getDirectoryFiles "" [srcDir </>  "main.c", srcDir </> "lib" </> "libbuild3a.a"]
        need cs_main

        putInfo "showing main source file"
        mapM putInfo cs_main

        putInfo "starting compile of main.c main file"
        let
          os_main = [buildDir </> c -<.> "o" | c <- cs_main]
        need os_main
        mapM putInfo os_main

        --cmd_ "gcc -o" [out] os_main
        --cmd_ "gcc -o -Llib -lbuild3a" [out] os_main
        cmd_ "gcc -o -Lsrc3b/lib -lbuild3a" [out] os_main

  buildDir </> srcDir </>  "main.o" %> \out -> do
        putInfo $ "buildDir/main.o: " ++ show out
        let c = dropDirectory1 $ out -<.> "c"
        let m = out -<.> "m"
        cmd_ "gcc -c" [c] "-o" [out] "-MMD -MF" [m]
        --cmd_ "gcc -c" [c] "-Lsrc3b/lib -lbuild3a -o" [out] "-MMD -MF" [m]
        neededMakefileDependencies m

  {-I added this as shake complained about not having a rule for libbuild3a.o
    I tried to deconstruct the library useing `ar`. Got rid of the no rule failure,
    but did not help in finding add.h in main.c-}     
  buildDir </> "src3b" </> "lib" </> "libbuild3a.o" %> \out -> do
        putInfo $ "buildDir/lib/libbuild3a.o: " ++ show out
        let c = dropDirectory1 $ out

        libs <- getDirectoryFiles "" [srcDir </> "lib" </> "libbuild3a.a"]
        need libs
        --cmd_ "ar rcs" [out] os_tq84
        --[cmd_ "ar -xv l add.o answer.o" [out] l | l <- libs]
        cmd_ "ar -xv libbuild3a.a add.o answer.o" [out] libs
build3b::IO()
build3b=shakeArgs shakeOptions{shakeFiles=“build3b”}$do
让
buildDir=“build3b”
srcDir=“src3b”
需要[buildDir“run3b”exe]
buildDir“run3b”exe%>\out->do
putInfo“========================================================================================”
--我需要加载静态库吗?
政务司司长
putInfo$“buildDir/main.o:”++显示
设c=dropDirectory1$out-“c”
设m=out—“m”
cmd_u“gcc-c”[c]“-o”[out]“-MMD-MF”[m]
--cmd_u“gcc-c”[c]“-Lsrc3b/lib-lbuild3a-o”[out]“-MMD-MF”[m]
neededmakefilem
{-我添加这个是因为shake抱怨没有libbuild3a.o的规则
我试图用“ar”来解构图书馆,摆脱了无规则的失败,
但是在main.c-}中查找add.h没有帮助
buildDir“src3b”libbuild3a.o“%>\out->do
putInfo$“buildDir/lib/libbuild3a.o:”++show out
设c=dropDirectory1$out

libsI通过将静态库与ghc选项链接,解决了这个问题

现在的问题是主_exe没有看到libsupply.a文件中的更改。我需要弄清楚如何满足它的需求,即使创建库的调用

cmd_ "ar rcs" [out] co
是规则中的最后一个表达式

以下是新的来源:

build4 :: IO ()
build4 = shakeArgs shakeOptions{shakeFiles="build4"} $ do
  let buildDir = "build4"
      srcDir = "src4"
  want [srcDir </>  "libsupply.a"]
  want [buildDir </> "main_exe" <.> exe]

  buildDir </> "main_exe" <.> exe %> \out -> do

      cmd_
          "ghc"
          ("src4" </> "main.hs")
          "-isrc"
          "-Lsrc4"
          "-lsupply"
          "-outputdir"
          "build4"
          "-o"
          out


  srcDir </> "libsupply.a" %> \out -> do
    putInfo $ "in build4/libsupply.a: " ++ ( show out)
    cs <- getDirectoryFiles "" [srcDir </> "*.c"]
    need  cs

    let co = [buildDir </> c -<.> "o" | c <- cs]
    need co

    cmd_ "ar rcs" [out] co


  --build the .c files required for the library
  buildDir </> "//*.o" %> \out -> do
    putInfo $ "in build_dir </> //*.o: " ++ ( show out)
    let c = dropDirectory1 $ out -<.> "c"
    let m = out -<.> "m"
    cmd_ "gcc -c" [c] "-o" [out] "-MMD -MF" [m]
    neededMakefileDependencies m
build4::IO()
build4=shakeArgs shakeOptions{shakeFiles=“build4”}$do
让buildDir=“build4”
srcDir=“src4”
想要[srcDir“libsupply.a”]
需要[buildDir“main_exe”exe]
buildDir“main\u exe”exe%>\out->do
指令_
“ghc”
(“src4”“main.hs”)
“-isrc”
“-Lsrc4”
“-L供应”
“-outputdir”
“构建4”
“-o”
出来
srcDir“libsupply.a”%>\out->do
build4/libsupply.a中的putInfo$”++(显示)
政务司司长
putInfo$“内部版本\u目录//*.o:”++(显示)
设c=dropDirectory1$out-“c”
设m=out—“m”
cmd_u“gcc-c”[c]“-o”[out]“-MMD-MF”[m]
neededmakefilem

我投票结束这个问题,因为这看起来应该迁移到代码审查“更好”为谁?代码的最终目的是什么?@MichaelLitchard可能是关于CR的主题,但请不要以此作为VTC的理由。相反,将其标记为版主干预,并解释其在主题中的作用。请看,但不确定你所说的离题,CR和VTC是什么意思。是否只是需要对其进行不同的标记?我正在使用haskell shake构建模块。代码的要点是学习使用shake构建haskell项目,该项目还生成并使用静态c库。VTC retracted。。
build4 :: IO ()
build4 = shakeArgs shakeOptions{shakeFiles="build4"} $ do
  let buildDir = "build4"
      srcDir = "src4"
  want [srcDir </>  "libsupply.a"]
  want [buildDir </> "main_exe" <.> exe]

  buildDir </> "main_exe" <.> exe %> \out -> do

      cmd_
          "ghc"
          ("src4" </> "main.hs")
          "-isrc"
          "-Lsrc4"
          "-lsupply"
          "-outputdir"
          "build4"
          "-o"
          out


  srcDir </> "libsupply.a" %> \out -> do
    putInfo $ "in build4/libsupply.a: " ++ ( show out)
    cs <- getDirectoryFiles "" [srcDir </> "*.c"]
    need  cs

    let co = [buildDir </> c -<.> "o" | c <- cs]
    need co

    cmd_ "ar rcs" [out] co


  --build the .c files required for the library
  buildDir </> "//*.o" %> \out -> do
    putInfo $ "in build_dir </> //*.o: " ++ ( show out)
    let c = dropDirectory1 $ out -<.> "c"
    let m = out -<.> "m"
    cmd_ "gcc -c" [c] "-o" [out] "-MMD -MF" [m]
    neededMakefileDependencies m