首页 > 解决方案 > 为什么 extra-lib-dirs 不能像堆栈中的 LD_LIBRARY_PATH 一样工作?

问题描述

--extra-lib-dirs表面上应该像LD_LIBRARY_PATH,但是当与我一起使用时,stack exec我会看到不同的结果:

$ stack --extra-lib-dirs=$MATLAB_PATH/bin/glnxa64 --extra-include-dirs=$MATLAB_PATH/extern/include --nix exec matlab-engine-test
/home/bebarker/workspace/haskell-matlab/.stack-work/install/x86_64-linux-nix/24c5769e9013838d87aa76fb4cdd10a09798b6904a6faa380de6fe6949e2c952/8.6.5/bin/matlab-engine-test: error while loading shared libraries: libmx.so: cannot open shared object file: No such file or directory

$ LD_LIBRARY_PATH=$MATLAB_PATH/bin/glnxa64 /home/bebarker/workspace/haskell-matlab/.stack-work/install/x86_64-linux-nix/24c5769e9013838d87aa76fb4cdd10a09798b6904a6faa380de6fe6949e2c952/8.6.5/bin/matlab-engine-test
matlab-engine-test: user error (engOpen)

LD_LIBRARY_PATH在这种情况下表现如预期(尽管显然我还有另一个不相关的问题要处理)。我应该寻找另一种选择还是我使用--extra-lib-dirs不正确?

标签: haskellhaskell-stack

解决方案


我不倾向于使用 Stack,但在构建系统中,命令行标志提供的库路径通常只传递给链接器。观察(带main = print =<< lookupEnv "LD_LIBRARY_PATH"):

$ stack --extra-lib-dirs=/foopath/bin/glnxa64 --extra-include-dirs=/foopath/extern/include exec ./foo
Just ""
$

与你第二次做的比较:

$ LD_LIBRARY_PATH=/foopath/bin/glnxa64 ./foo
Just "/foopath/bin/glnxa64"

推荐阅读