Haskell Stack和C Libraries II

时间:2016-01-10 07:50:37

标签: haskell ghc ffi haskell-stack

这是this post的后续行动(不幸的是)。

我正在尝试stack build一个项目,其中Main.hslibMyLib.so中的专有C库/usr/local/lib进行了一些FFI调用(包含在LD_LIBRARY_PATH中1}})。

使用命令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文件({ {1}})。

我玩过各种GCC编译选项,例如: extra-lib-dirs: [/usr/local/lib]代替-pthread ...,通过-threaded文件参数或直接通过.cabalstack build),但无济于事。

我的问题:我应该在哪里看?我应该运行什么样的测试才能找到问题的根源(明显的链接问题)?

==编辑==
安装了相同C库的两个版本,其中一个版本依赖于另一个C库,比如stack build --ghc-options="-foo..."。 当我终于意识到这一点时,我将它添加到cabal文件中并且运行正常:

libOther.so

0 个答案:

没有答案