这是这篇文章的后续内容(不幸的是)。
我正在尝试stack build
一个项目,其中对位于(包含在) 中Main.hs
的专有 C 库有一些 FFI 调用。libMyLib.so
/usr/local/lib
LD_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
...,但无济于事。.cabal
stack build
stack build --ghc-options="-foo..."
我的问题:我还应该去哪里看?我应该运行什么样的测试来找出问题的根源(明显的链接问题)?
== 编辑 ==
安装了同一个 C 库的两个版本,一个依赖于另一个 C 库,比如libOther.so
. 当我终于意识到这一点时,我将它添加到 cabal 文件中并且效果很好:
extra-libraries: Other, MyLib