3

这是这篇文章的后续内容(不幸的是)。

我正在尝试stack build一个项目,其中对位于(包含在) 中Main.hs的专有 C 库有一些 FFI 调用。libMyLib.so/usr/local/libLD_LIBRARY_PATH

当使用命令在 GHCi(外部stack)中运行时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...,但无济于事。.cabalstack buildstack build --ghc-options="-foo..."

我的问题:我还应该去哪里看?我应该运行什么样的测试来找出问题的根源(明显的链接问题)?

== 编辑 ==
安装了同一个 C 库的两个版本,一个依赖于另一个 C 库,比如libOther.so. 当我终于意识到这一点时,我将它添加到 cabal 文件中并且效果很好:

extra-libraries:     Other, MyLib
4

0 回答 0