Haskell GHC编译库未定义“;“主要”;

Haskell GHC编译库未定义“;“主要”;,haskell,ghc,Haskell,Ghc,可能重复: 有人在使用链接到另一个库的GHC编译库时遇到问题吗 文件: 输出: > ghc --version The Glorious Glasgow Haskell Compilation System, version 7.0.4 > ghc TestLib.hs -o test -no-hs-main -L../libmylib -lmylib Linking test ... Undefined symbols: "_main", referenced from:

可能重复:

有人在使用链接到另一个库的GHC编译库时遇到问题吗

文件:

输出:

> ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.0.4
> ghc TestLib.hs -o test -no-hs-main -L../libmylib -lmylib
Linking test ...
Undefined symbols:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
>

我使用“ar-r-s…”创建“libmylib.a”库文件。

从ghc-7开始,默认模式是
--make
。您想要创建一个库,因此必须使用
-c
标志告诉GHC。您不需要
-no hs main

 ghc -c TestLib.hs -o test.o
工作

例如:

clib.h:
int-doTest(无效);
clib.c:
#包括“clib.h”
整数点测试(空){
返回42;
}
TestLib.hs: libtest.c:
#包括
#包括“TestLib_stub.h”
int main(int argc,char*argv[])
{
hs_init(&argc,&argv);
printf(“%d\n”,test_me());
hs_退出();
返回0;
}
汇编和执行: 注:在ghc>=7.2的情况下也可以这样工作;对于ghc-7.0.*,还必须编译生成的
TestLib_stub.c
文件并链接到
TestLib_stub.o


重要的一点是告诉ghc不要在创建库时链接,只有在最终创建可执行文件时才链接。

使用“-make”和6.10.4会给我一个非常大的静态库,其中包含链接使用的所有模块。这是可行的,但给出了一个很小的文件,该文件必须只包含TestLib.hs中的函数(当我在中添加其他模块时)。。。也许我现在需要自己链接?你想实现什么
--make
使其尝试链接。我想要一个libtest.a文件;这样我就可以把它和我的主C程序链接起来。好的,这应该可以用
ghc-C-o libtest.a TestLib.hs
然后
ghc-o prog-no hs main yourman.C libtest.a
。我不能用ghc-it来编译C库。我还希望避免使用GHC链接到我的主可执行文件,但这并不重要。理想情况下,我会使用GHC创建一个包含整个Haskell运行时的libtest.a,这样我就可以在没有GHC的情况下将libtest链接到任何需要它的东西中。创建库时,您不能使用
--make
模式,因此您必须通过
-c
或类似的程序来告诉GHC它不应该链接。
 ghc -c TestLib.hs -o test.o
{-# LANGUAGE ForeignFunctionInterface #-}
module TestLib where

foreign export ccall test_me :: IO (Int)
foreign import ccall "clib.h" doTest :: IO ( Int )
test_me = doTest
$ ghc -c -o clib.o clib.c
$ ar -r -s libclib.a clib.o
ar: creating libclib.a
$ ghc TestLib.hs -c -o tlib.o
$ ar -r -s libtlib.a tlib.o
ar: creating libtlib.a
$ ghc -o nltest libtest.c -no-hs-main -L. -ltlib -lclib
$ ./nltest
42