これはこの投稿のフォローアップです(残念ながら)。
にある独自の C ライブラリ への FFI 呼び出しがいくつかstack build
あるプロジェクトを試みています(これは に含まれています)。 Main.hs
libMyLib.so
/usr/local/lib
LD_LIBRARY_PATH
stack
コマンドを使用してGHCi (外部) で実行するとghci /usr/local/lib/ -lMyLib
、すべて正常に動作します。
ただし、実行時stack build
に、リンク関連の問題があります。
me@user:~/myproject$ stack build
myproject-0.1.0.0: build
Preprocessing library myproject-0.1.0.0...
In-place registering myproject-0.1.0.0...
Preprocessing executable 'myproject-exe' for myproject-0.1.0.0...
Linking .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/myproject-exe/myproject-exe ...
/usr/bin/ld: .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/myproject-exe/myproject-exe-tmp/Main.o: undefined reference to symbol 'mycfunction'
/usr/local/lib/libMyLib.so.2: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
-- While building package myproject-0.1.0.0 using:
/home/me/.stack/setup-exe-cache/x86_64-linux/setup-Simple-Cabal-1.22.5.0-ghc-7.10.3 --builddir=.stack-work/dist/x86_64-linux/Cabal-1.22.5.0 build lib:myproject exe:myproject-exe --ghc-options " -ddump-hi -ddump-to-file"
Process exited with code: ExitFailure 1
関連する cabal ファイルのエクストラは次のとおりです。
library
hs-source-dirs: src
exposed-modules: Lib
build-depends: base >= 4.7 && < 5
default-language: Haskell2010
extra-libraries: MyLib
executable myproject-exe
hs-source-dirs: app
main-is: Main.hs
ghc-options: -threaded -rtsopts -with-rtsopts=-N
build-depends: base, bytestring, safe, split
, myproject
default-language: Haskell2010
実行すると、 が正しいディレクトリ ( ) を指しているstack exec env
ことが示されます。このディレクトリをファイルに追加したことを確認するためです ( )。LD_LIBRARY_PATH
LD_LIBRARY_PATH=/usr/local/lib
.yaml
extra-lib-dirs: [/usr/local/lib]
私はさまざまな GCC コンパイル オプションを試しました。たとえば、 ... の-pthread
代わりに、ファイル パラメーターを介して、または( ) を介して直接実行しましたが、役に立ちませんでした。-threaded
.cabal
stack build
stack build --ghc-options="-foo..."
私の質問:他にどこを見るべきですか? 問題の原因 (明らかなリンクの問題) を見つけるには、どのようなテストを実行すればよいですか?
== 編集 ==
インストールされた同じ C ライブラリの 2 つのバージョンがあり、1 つは別の C ライブラリに依存していますlibOther.so
。私が最終的にそれに気づいたとき、私はそれを cabal ファイルに追加し、それはうまくいきました:
extra-libraries: Other, MyLib