这是this post的后续行动(不幸的是)。
我正在尝试stack build
一个项目,其中Main.hs
对libMyLib.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
文件参数或直接通过.cabal
(stack build
),但无济于事。
我的问题:我应该在哪里看?我应该运行什么样的测试才能找到问题的根源(明显的链接问题)?
==编辑==
安装了相同C库的两个版本,其中一个版本依赖于另一个C库,比如stack build --ghc-options="-foo..."
。
当我终于意识到这一点时,我将它添加到cabal文件中并且运行正常:
libOther.so