编译用haskell和模板haskell编写的共享对象并用c将其与main链接

编译用haskell和模板haskell编写的共享对象并用c将其与main链接,c,gcc,makefile,ghc,template-haskell,C,Gcc,Makefile,Ghc,Template Haskell,我正在尝试将几个可读的haskell(.lhs)文件编译成一个共享对象(.so),然后将其与用c编写的main链接。不过,这里的问题是,用于创建的文件中有两个。模板haskell也是。我遵循编译a.so的规则使用模板haskell,这意味着我完成了以下步骤: 1.我以静态方式编译了每个.lhs文件 2.然后,我第二次动态编译了它们。 3.我根据从步骤1和2获得的对象文件创建了共享对象。 4.我将main.c编译成main.o 5.我从步骤3和4创建了一个可执行文件。 有3个文件可以从中创建.so

我正在尝试将几个可读的haskell(.lhs)文件编译成一个共享对象(.so),然后将其与用c编写的main链接。不过,这里的问题是,用于创建的文件中有两个。模板haskell也是。我遵循编译a.so的规则使用模板haskell,这意味着我完成了以下步骤:
1.我以静态方式编译了每个.lhs文件
2.然后,我第二次动态编译了它们。
3.我根据从步骤1和2获得的对象文件创建了共享对象。
4.我将main.c编译成main.o
5.我从步骤3和4创建了一个可执行文件。

有3个文件可以从中创建.so。Dep1.lhs、Dep2.lhs和Dep3.lhs,以及用c编写的main

编译makefile时,我收到以下消息:

我的目录>>全部生成
rm-f*.o*.hi*.so*.dyn\u hi*.dyn\u o main
ghc-c Dep3.lhs-XTemplateHaskell-XForeignFunctionInterface-o Dep3.o
ghc-c Dep3.lhs-动态-XTemplateHaskell-fPIC-无hs主-XForeignFunctionInterface-o Dep3.dyn_o-osuf dyn_o-hisuf dyn_hi ghc-c Dep2.lhs-XTemplateHaskell-XForeignFunctionInterface-o Dep2.o
ghc-c Dep2.lhs-dynamic-XTemplateHaskell-fPIC-no hs main-XForeignFunctionInterface-o Dep2.dyn_o-osuf dyn_o-hisuf dyn_hi
ghc-c Dep1.lhs-XTemplateHaskell-XForeignFunctionInterface-o Dep1.o

正在加载程序包ghc prim。。。链接。。。完成。 正在加载包整型gmp。。。链接。。。完成了
正在加载包库。。。链接。。。完成了
正在加载程序包pretty-1.1.1.0。。。链接。。。完成了
正在加载包数组-0.4.0.1。。。链接。。。完成了
加载包深度Seq-1.3.0.1。。。链接。。。完成了
装载包装容器-0.5.0.0。。。链接。。。完成了
正在加载haskell包模板。。。链接。。。完成了
ghc-c Dep1.lhs-dynamic-XTemplateHaskell-fPIC-no hs main-XForeignFunctionInterface-o Dep1.dyn_o-osuf dyn_o-hisuf dyn_hi
正在加载程序包ghc prim。。。链接。。。完成了
正在加载包整型gmp。。。链接。。。完成了
正在加载包库。。。链接。。。完成了
正在加载程序包pretty-1.1.1.0。。。链接。。。完成了
正在加载包数组-0.4.0.1。。。链接。。。完成了
加载包深度Seq-1.3.0.1。。。链接。。。完成了
装载包装容器-0.5.0.0。。。链接。。。完成了
正在加载haskell包模板。。。链接。。。完成了
ghc-O2-动态-共享-fPIC Dep1.dyn_o Dep2.dyn_o Dep3.dyn_o-o libShared.so-lHSrts-ghc7.6.3
gcc-O2-I/usr/local/lib/ghc-7.6.3/include-L/usr/local/lib/ghc-7.6.3-L/usr/local/lib/ghc-7.6.3/template-haskell-2.8.0.0/-c Main.c-o Main.o
gcc-o main.o-L/usr/local/lib/ghc-7.6.3-L/usr/local/lib/ghc-7.6.3/template-haskell-2.8.0.0/-L-lShared-Wl,-rpath,/usr/local/lib/ghc-7.6.3-L/home/tal/a_先决条件/new_-haskell/ghc-7.6.3/libraries/base/dist-install/build/libHSbase-4.6.0.1-ghc7.6.3-lHStemplate-haskell-2.8.0.0
/usr/bin/ld:动态变量“ghczmprim\u GHCziTypes\u True\u closure”的大小为零

/usr/bin/ld:动态变量“ghczmprim\u GHCziTypes\u ZMZN\u closure”的大小为零

/usr/bin/ld:/usr/local/lib/ghc-7.6.3/template-haskell-2.8.0.0//libHStemplate-haskell-2.8.0.0.a(Syntax_1744.o)(.text+0x77):针对符号“ghczmprim_GHCziTypes_True_closure”的不可解R_X86_64_32重定位

/usr/bin/ld:/usr/local/lib/ghc-7.6.3/template-haskell-2.8.0.0//libHStemplate-haskell-2.8.0.0.a(lib_uuu228.o)(.text+0x14):针对符号“ghczmprim_ghcznitypes_ZMZN_闭包”的不可解R_X86_64重新定位

/usr/bin/ld:/usr/local/lib/ghc-7.6.3/template-haskell-2.8.0.0//libHStemplate-haskell-2.8.0.0.a(lib_uuu137.o)(.text+0x14):针对符号“ghczmprim_ghcznitypes_ZMZN_闭包”的不可解决的R_X86_64重新定位

/usr/bin/ld:/usr/local/lib/ghc-7.6.3/template-haskell-2.8.0.0//libHStemplate-haskell-2.8.0.0.a(lib_uuu227.o)(.text+0x14):针对符号“ghczmprim_ghcznitypes_ZMZN_闭包”的不可解R_X86_64_32S重新定位

/usr/bin/ld:/usr/local/lib/ghc-7.6.3/template-haskell-2.8.0.0//libHStemplate-haskell-2.8.0.0.a(lib_uuu124.o)(.text+0x14):针对符号“ghczmprim_GHCziTypes_znu”闭包的不可解R_X86_64_32S重新定位

创建了一个可执行文件“main”,但当我尝试运行它时,会出现以下情况:

host113@/home/tal/Documents/mfbus>>main
main:加载共享库时出错:libHSbase-4.6.0.1-ghc7.6.3.so:无法打开共享对象文件:没有此类文件或目录

我试图在最后一条规则(main)中包含'libHSbase-4.6.0.1-ghc7.6.3.目录,因此'so'在'-l'选项中,以便加载它。但它似乎不起作用。也许有人能洞察到这个错误

Dep1.lhs的代码:

> {-# LANGUAGE TemplateHaskell #-} <br/>
> {-# LANGUAGE ForeignFunctionInterface #-} <br/>

> module Dep1 where

> import Foreign <br/>
> import Foreign.C.Types <br/>
> import Dep3 <br/>

> data MyData = MyData
>    { foo :: String
>    , bar :: Int
>    }

> emptyShow ''MyData

> foreign export ccall some_func :: IO () <br/>
> foreign export ccall factorial :: Int -> Int

> some_func :: IO () <br/>
> some_func = print $ MyData { foo = "bar", bar = 5 }

> factorial :: Int -> Int <br/>
> factorial 0 = 1  <br/>
> factorial n = n *(factorial $ n - 1)    

注意:我对Haskell的了解是有限的,这个答案对Haskell没有任何假设

错误显示:

:加载共享库时出错:
。因此:无法打开共享对象文件:没有此类文件或目录

这意味着在尝试执行程序时,找不到共享对象。请注意在链接期间和执行期间查找共享对象之间的区别

粗略地说,当您使用
-L
-L
链接到共享对象时,链接并没有完全完成,而是记住在运行时完成。当您执行依赖于该共享对象的可执行文件时,其他人(不是编译器)必须能够找到该共享对象并进行链接:同样粗略地说

所以你也需要让Linux找到你的共享对象。有几种方法可以做到这一点,其中一些已被弃用。我建议使用共享对象的路径编写一个文件,并将
> {-# LANGUAGE TemplateHaskell, FlexibleInstances #-}

> module Dep3 where

> import Language.Haskell.TH

> emptyShow :: Name -> Q [Dec] <br/>
> emptyShow name = [d|instance Show $(conT name) where show _ = "some meaningful sentence"|]
> {-# LANGUAGE ForeignFunctionInterface #-}

> module Dep2 where <br/>

> import Foreign    <br/>
> import Foreign.C.Types

> foreign export ccall power :: CInt -> CInt

> power :: CInt -> CInt
> power n = n*n
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <HsFFI.h>

#ifdef __GLASGOW_HASKELL__
#include "Tal2_stub.h"
#endif

#ifdef __GLASGOW_HASKELL__
extern void __stginit_power ( void );
#endif

// int power(int i){ return i*i; }

int fact(int i){
  if (i == 0) return 1;
  else return i * fact(i-1);
}
nt main(int argc, char *argv[]){
  hs_init(&argc, &argv);

#ifdef __GLASGOW_HASKELL__
  hs_add_root(__stginit_power);
#endif

 printf("what is 5!?\n");
 char buf[2048];
 scanf("%s",buf);
 int x = atoi(buf);
 if(x == fact(5)){
   printf("You're right!\n");
 } else {
   printf("You're wrong!\n");
 }
 printf("what is the power of 2?\n");
 scanf("%s",buf);
 x = atoi(buf);
 if(x == power(2)){
   printf("You're right!\n");
 } else {
   printf("You're wrong!\n");
 }
 hs_exit();
 return 0;
}
all : clean main

main : shared main.o
        gcc -o main main.o -L/usr/local/lib/ghc-7.6.3 -L/usr/local/lib/ghc-7.6.3/template-haskell-2.8.0.0/ -L. -lShared -Wl,-rpath,/usr/local/lib/ghc-7.6.3 -L/home/tal/a_prerequisites/new_haskell/ghc-7.6.3/libraries/base/dist-install/build/libHSbase-4.6.0.1-ghc7.6.3. -lHStemplate-haskell-2.8.0.0 

main.o : 
    gcc -O2 -I/usr/local/lib/ghc-7.6.3/include -L/usr/local/lib/ghc-7.6.3 -L/usr/local/lib/ghc-7.6.3/template-haskell-2.8.0.0/ -c Main.c -o main.o 

shared : dep3second dep2second dep1second
        ghc -O2 -dynamic -shared -fPIC Dep1.dyn_o Dep2.dyn_o Dep3.dyn_o -o    libShared.so -lHSrts-ghc7.6.3

dep1second : dep1first
    ghc -c Dep1.lhs -dynamic -XTemplateHaskell -fPIC -no-hs-main -XForeignFunctionInterface -o Dep1.dyn_o -osuf dyn_o -hisuf dyn_hi   

dep2second : dep2first
    ghc -c Dep2.lhs -dynamic -XTemplateHaskell -fPIC -no-hs-main -XForeignFunctionInterface -o Dep2.dyn_o -osuf dyn_o -hisuf dyn_hi

dep3second: dep3first
    ghc -c Dep3.lhs -dynamic -XTemplateHaskell -fPIC -no-hs-main    -XForeignFunctionInterface -o Dep3.dyn_o -osuf dyn_o -hisuf dyn_hi

dep1first :
    ghc -c Dep1.lhs -XTemplateHaskell -XForeignFunctionInterface -o Dep1.o  

dep2first :
    ghc -c Dep2.lhs -XTemplateHaskell -XForeignFunctionInterface -o Dep2.o

dep3first :
    ghc -c Dep3.lhs -XTemplateHaskell -XForeignFunctionInterface -o Dep3.o

.PHONY : clean
clean :
    -rm -f *.o *.hi *.so *.dyn_hi *.dyn_o main