我正在嘗試從 github 運行此示例:https : //github.com/nh2/haskell-from-python/blob/master/Makefile 我想了解如何從另一種語言運行一種語言。我不確定 FFI 是否以某種方式在這里發揮作用,我只是不知道要說清楚。
我在 WSL - debian 上運行代碼。我也嘗試在 Windows 上運行它,但我遇到了同樣的問題。我的錯誤是在運行“make”然后運行“python program.py”之后我得到:
Traceback (most recent call last):
File "program.py", line 5, in <module>
lib = cdll.LoadLibrary("./libffi-example.so")
File "/usr/lib/python2.7/ctypes/__init__.py", line 444, in LoadLibrary
return self._dlltype(name)
File "/usr/lib/python2.7/ctypes/__init__.py", line 366, in __init__
self._handle = _dlopen(self._name, mode)
OSError: /usr/lib/ghc/ghc-prim-0.5.2.0/libHSghc-prim-0.5.2.0-ghc8.4.4.so: undefined symbol: stg_gc_unpt_r1
我不知道 stg_gc_unput_r1 是什么,它在任何代碼中都不是變數。我還查看了一些 GHC 檔案,但找不到任何內容。我在存盤庫上的問題沒有得到任何關注,雖然我發布它才一天,但代碼已經有好幾年了。
我對 Haskell 和 ghc 沒有經驗,對 Python 也很少,所以任何幫助和耐心將不勝感激。
在檢查檔案/usr/lib/ghc/rts/libHSrts-ghc8.4.4.so確實存在后,這是運行的輸出ldd libffi-example.so:
linux-vdso.so.1 (0x00007ffd5f5ee000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fcc439c7000)
libHSbase-4.11.1.0-ghc8.4.4.so => /usr/lib/ghc/base-4.11.1.0/libHSbase-4.11.1.0-ghc8.4.4.so (0x00007fcc4304c000)
libHSinteger-gmp-1.0.2.0-ghc8.4.4.so => /usr/lib/ghc/integer-gmp-1.0.2.0/libHSinteger-gmp-1.0.2.0-ghc8.4.4.so (0x00007fcc43009000)
libHSghc-prim-0.5.2.0-ghc8.4.4.so => /usr/lib/ghc/ghc-prim-0.5.2.0/libHSghc-prim-0.5.2.0-ghc8.4.4.so (0x00007fcc42b7b000)
libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fcc42af8000)
libatomic.so.1 => /usr/lib/x86_64-linux-gnu/libatomic.so.1 (0x00007fcc42aec000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcc4292b000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcc43b58000)
libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007fcc42921000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fcc42900000)
我嘗試過的事情:
- 使用 -no-hs-main 選項運行
- 閱讀 ghc 檔案
- 發布github問題
- 將 GHC_RUNTIME_LINKER_FLAG 中的 ghc 版本更改為 8.4.4,我當前的版本
uj5u.com熱心網友回復:
我試圖在 WSL 安裝下使用全新的 Debian 復制您的問題。我在 Windows 10 下的 WSL 1 下運行 Debian“bullseye”。那個 Debian 版本必須比你的新一點,因為 GHC 包是版本 8.8.4 而不是 8.4.4,但這似乎是唯一的區別。
使用該 Git 存盤庫 (commit 9c3b6315)的干凈副本,僅包含Makefile更改的內容(如下所示,除了通常的“tab”縮進):
GHC=ghc
GHC_RUNTIME_LINKER_FLAG=-L/usr/lib/ghc/rts -lHSrts-ghc8.8.4
libffi-example.so: Example.o wrapper.o
$(GHC) -o $@ -shared -dynamic -fPIC $^ $(GHC_RUNTIME_LINKER_FLAG)
Example_stub.h Example.o: Example.hs
$(GHC) -c -dynamic -fPIC Example.hs
wrapper.o: wrapper.c Example_stub.h
$(GHC) -c -dynamic -fPIC wrapper.c
clean:
rm -f *.hi *.o *_stub.[ch]
clean-all:
rm -f *.hi *.o *_stub.[ch] *.so
# Runs the example Python program
example: libffi-example.so
python program.py
我可以運行以下命令:
buhr@DESKTOP-585NUKU:~/src/haskell-from-python$ make clean-all
rm -f *.hi *.o *_stub.[ch] *.so
buhr@DESKTOP-585NUKU:~/src/haskell-from-python$ make example
ghc -c -dynamic -fPIC Example.hs
ghc -c -dynamic -fPIC wrapper.c
ghc -o libffi-example.so -shared -dynamic -fPIC Example.o wrapper.o -L/usr/lib/ghc/rts -lHSrts-ghc8.8.4
python program.py
Haskell fib(0): 0
Haskell fib(1): 1
Haskell fib(2): 1
Haskell fib(3): 2
Haskell fib(4): 3
Haskell fib(5): 5
Haskell fib(6): 8
Haskell fib(7): 13
Haskell fib(8): 21
Haskell fib(9): 34
buhr@DESKTOP-585NUKU:~/src/haskell-from-python$ ldd libffi-example.so
linux-vdso.so.1 (0x00007ffff6925000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7c7b810000)
libHSrts-ghc8.8.4.so => /usr/lib/ghc/rts/libHSrts-ghc8.8.4.so (0x00007f7c7b7a0000)
libHSbase-4.13.0.0-ghc8.8.4.so => /usr/lib/ghc/base-4.13.0.0/libHSbase-4.13.0.0-ghc8.8.4.so (0x00007f7c7ae00000)
libHSinteger-gmp-1.0.2.0-ghc8.8.4.so => /usr/lib/ghc/integer-gmp-1.0.2.0/libHSinteger-gmp-1.0.2.0-ghc8.8.4.so (0x00007f7c7adc0000)
libHSghc-prim-0.5.3-ghc8.8.4.so => /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.8.4.so (0x00007f7c7a920000)
libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f7c7a880000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7c7a6b0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7c7b973000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f7c7a6a0000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7c7a690000)
libffi.so.7 => /usr/lib/x86_64-linux-gnu/libffi.so.7 (0x00007f7c7a680000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7c7a65e000)
buhr@DESKTOP-585NUKU:~/src/haskell-from-python$
如果我故意破壞Makefile, 比如說通過注釋掉GHC_RUNTIME_LINKER_FLAG鏈接或拼寫錯誤使其實際上不包含在libffi-example.so鏈接命令中,那么我可以準確地復制您的問題。請注意以下記錄_MISTAKE中的第二行Makefile,這會阻止 RTS 庫實際鏈接:
buhr@DESKTOP-585NUKU:~/src/haskell-from-python$ head Makefile
GHC=ghc
GHC_RUNTIME_LINKER_FLAG_MISTAKE=-L/usr/lib/ghc/rts -lHSrts-ghc8.8.4
libffi-example.so: Example.o wrapper.o
$(GHC) -o $@ -shared -dynamic -fPIC $^ $(GHC_RUNTIME_LINKER_FLAG)
Example_stub.h Example.o: Example.hs
$(GHC) -c -dynamic -fPIC Example.hs
wrapper.o: wrapper.c Example_stub.h
buhr@DESKTOP-585NUKU:~/src/haskell-from-python$ make clean-all
rm -f *.hi *.o *_stub.[ch] *.so
buhr@DESKTOP-585NUKU:~/src/haskell-from-python$ make example
ghc -c -dynamic -fPIC Example.hs
ghc -c -dynamic -fPIC wrapper.c
ghc -o libffi-example.so -shared -dynamic -fPIC Example.o wrapper.o
python program.py
Traceback (most recent call last):
File "program.py", line 4, in <module>
lib = cdll.LoadLibrary("./libffi-example.so")
File "/usr/lib/python2.7/ctypes/__init__.py", line 444, in LoadLibrary
return self._dlltype(name)
File "/usr/lib/python2.7/ctypes/__init__.py", line 366, in __init__
self._handle = _dlopen(self._name, mode)
OSError: /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.8.4.so: undefined symbol: stg_gc_unpt_r1
make: *** [Makefile:22: example] Error 1
buhr@DESKTOP-585NUKU:~/src/haskell-from-python$ ldd libffi-example.so
linux-vdso.so.1 (0x00007fffea75d000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f83175e0000)
libHSbase-4.13.0.0-ghc8.8.4.so => /usr/lib/ghc/base-4.13.0.0/libHSbase-4.13.0.0-ghc8.8.4.so (0x00007f8316c40000)
libHSinteger-gmp-1.0.2.0-ghc8.8.4.so => /usr/lib/ghc/integer-gmp-1.0.2.0/libHSinteger-gmp-1.0.2.0-ghc8.8.4.so (0x00007f8316c00000)
libHSghc-prim-0.5.3-ghc8.8.4.so => /usr/lib/ghc/ghc-prim-0.5.3/libHSghc-prim-0.5.3-ghc8.8.4.so (0x00007f8316760000)
libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f83166d0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f83164f0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8317741000)
libffi.so.7 => /usr/lib/x86_64-linux-gnu/libffi.so.7 (0x00007f83164e0000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f83164be000)
buhr@DESKTOP-585NUKU:~/src/haskell-from-python$
在我看來,在進行實驗時,您以某種方式破壞了您的內容,Makefile因此它實際上并未與/usr/lib/ghc/libHSrts-ghc8.4.4.so.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/399711.html
