3

これはこの投稿のフォローアップです(残念ながら)。

にある独自の C ライブラリ への FFI 呼び出しがいくつかstack buildあるプロジェクトを試みています(これは に含まれています)。 Main.hslibMyLib.so/usr/local/libLD_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_PATHLD_LIBRARY_PATH=/usr/local/lib.yamlextra-lib-dirs: [/usr/local/lib]

私はさまざまな GCC コンパイル オプションを試しました。たとえば、 ... の-pthread代わりに、ファイル パラメーターを介して、または( ) を介して直接実行しましたが、役に立ちませんでした。-threaded.cabalstack buildstack build --ghc-options="-foo..."

私の質問:他にどこを見るべきですか? 問題の原因 (明らかなリンクの問題) を見つけるには、どのようなテストを実行すればよいですか?

== 編集 ==
インストールされた同じ C ライブラリの 2 つのバージョンがあり、1 つは別の C ライブラリに依存していますlibOther.so。私が最終的にそれに気づいたとき、私はそれを cabal ファイルに追加し、それはうまくいきました:

extra-libraries:     Other, MyLib
4

0 に答える 0