这听起来可能像噩梦,但我真的很想让它正常工作。我在很大程度上使用了这个例子:Calling C from Haskell,我正在尝试让它在ubuntu上运行。
我用java运行这段代码:
package test;
public class JniTest {
public native int fib(int x);
}
这是在用javah:(test_JniTest.c)创建.h文件之后的c中的代码。
#include "test_JniTest.h"
#include "Safe_stub.h"
JNIEXPORT jint JNICALL Java_test_JniTest_fib(JNIEnv * e, jobject o, jint f)
{
return fibonacci_hs(f);
}
然后在haskell中引用(在存根之前):(Safe.hs)
module Safe where
import Foreign.C.Types
fibonacci :: Int -> Int
fibonacci n = fibs !! n
where fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
fibonacci_hs :: CInt -> CInt
fibonacci_hs = fromIntegral . fibonacci . fromIntegral
foreign export ccall fibonacci_hs :: CInt -> CInt
这是我尝试用来编译它的方法:
ghc -c -O Safe.hs
然后是:
ghc -shared -o libTest.jnilib -optc-O test_JniTest.c -I/usr/lib/jvm/java-6-sun-1.6.0.26/include -I/usr/lib/jvm/java-6-sun-1.6.0.26/include/linux
我得到了这个错误:
/usr/bin/ ld : test_JniTest.o:针对未定义符号的重定位R_X86_64_PC32创建共享对象时不能使用`fibonacci_hs‘;使用-fPIC重新编译/usr/bin/ld:最终链接失败:坏值collect2: ld返回1个退出状态
我无论如何都不是c语言专家,也不知道该怎么做。我尝试了用-fPIC的各种编译方法,但我总是得到相同的错误。你知道我可能做错了什么吗?
谢谢!
https://stackoverflow.com/questions/7961335
复制相似问题