使用链接到另一个库的GHC编译库时有任何问题吗?
文件:
module TestLib where
foreign export ccall test_me :: IO (Int)
foreign import "mylib_do_test" doTest :: IO ( Int )
test_me = doTest
输出:
> 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”库文件。
答案 0 :(得分:3)
从ghc-7开始,默认模式为--make
。您想要创建一个库,因此您必须告诉GHC -c
标志。您当时不需要-no-hs-main
。
ghc -c TestLib.hs -o test.o
作品。
一个例子:
int doTest(void);
#include "clib.h"
int doTest(void){
return 42;
}
{-# LANGUAGE ForeignFunctionInterface #-}
module TestLib where
foreign export ccall test_me :: IO (Int)
foreign import ccall "clib.h" doTest :: IO ( Int )
test_me = doTest
#include <stdio.h>
#include "TestLib_stub.h"
int main(int argc, char *argv[])
{
hs_init(&argc, &argv);
printf("%d\n", test_me());
hs_exit();
return 0;
}
$ 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
注意:这样可以使用ghc&gt; = 7.2;对于ghc-7.0。*,您还必须编译生成的TestLib_stub.c
文件并链接到TestLib_stub.o
。
重要的一点是在创建库时告诉ghc not 链接,只有在最终创建可执行文件时才会链接。