- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个具有以下结构的项目:
Cargo.toml
my_script.py
my_lib:
- Cargo.toml
- src
my_bin:
- Cargo.toml
- src
地点:
my_lib
是一个带有 crate-type = ["dylib"]
my_bin
是一个使用 my_lib
my_script.py
是一个也使用 my_lib
根 Cargo.toml
包含一个基本的工作空间声明:
[workspace]
members = [
"my_lib",
"my_bin"
]
如果我执行 cargo build
和 cargo run -p my_bin
,一切正常。问题来自 Python 脚本。
在此脚本中,我使用以下代码加载 my_lib
lib 文件:
from ctypes import cdll
from sys import platform
if platform == 'darwin':
prefix = 'lib'
ext = 'dylib'
elif platform == 'win32':
prefix = ''
ext = 'dll'
else:
prefix = 'lib'
ext = 'so'
# Working path:
# lib_path = './my_lib/target/debug/{}my_lib.{}'.format(prefix, ext)
# Buggy "Library not loaded: @rpath/libstd-d00eaa6834e55536.dylib" path:
lib_path = './target/debug/{}my_lib.{}'.format(prefix, ext)
lib = cdll.LoadLibrary(lib_path)
my_func = lib.my_func
my_func()
如果我使用库目录 (./my_lib/target/...
) 中的库文件,脚本加载库并执行它的过程没有问题功能。
但是如果我使用工作区目录 (./target/...
) 中的库文件,我在尝试加载库时会收到以下错误:
OSError: dlopen(./target/debug/libpeglrs.dylib, 6): Library not loaded: @rpath/libstd-d00eaa6834e55536.dylib
以同样的方式,尝试直接从工作区目标目录执行 my_bin
会产生相同的错误(即使 cargo run -p my_bin
工作完美)。
使用软件“Dependency Walker”,发现my_lib
库找不到Rust的libstd
库(前面的报错信息有解释)。
将包含 Rust 工具链库的路径手动导出到环境 PATH
中可以解决此问题。然而,这远非理想且不可移植。我也不明白为什么这个问题只发生在使用workspace目标时。
那么,为什么工作区目标找不到 rust 的 libstd
而每个项目目标都可以找到?有没有一种不需要查找工具链路径和修改环境变量的方法来解决这个问题?
最佳答案
动态链接有时并不容易。错误消息 Library not loaded: @rpath/libstd-d00eaa6834e55536.dylib
非常清楚。 DYLD_LIBRARY_PATH
(macOS) 有问题。
您的 DYLD_LIBRARY_PATH
不包含 Rust 库路径。将以下内容放入您的 ~/.bash_profile
:
source "$HOME/.cargo/env"
export RUST_SRC_PATH="$(rustc --print sysroot)/lib/rustlib/src/rust/src"
export DYLD_LIBRARY_PATH="$(rustc --print sysroot)/lib:$DYLD_LIBRARY_PATH"
我遵循了你的项目结构,除了一件事 - 我删除了 _
(my_bin
-> mybin
, ...)。
cargo run --bin mybin
对比 target/debug/mybin
首先,检查 otool -L target/debug/mybin
说了什么:
target/debug/mybin:
/Users/robertvojta/Work/bar/target/debug/deps/libmylib.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libstd-d4fbe66ddea5f3ce.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
/usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0)
注意 @rpath
。如果您不知道它是什么,我建议您阅读 Mike Ash 的帖子:
同时运行 man dlopen
并阅读 SEARCHING
部分。复制粘贴到这里太长了,所以,就第一句:
dlopen() searches for a compatible Mach-O file in the directories specified by a set of environment variables and the process's current working directory.
您将了解 DYLD_LIBRARY_PATH
和其他环境变量。
在您的 shell 中,echo $DYLD_LIBRARY_PATH
命令的输出是什么?我假设它是空的/不包含 Rust 库路径。
将以下行添加到您的 mybin:main.rs
...
println!(
"DYLD_LIBRARY_PATH={}",
std::env::var("DYLD_LIBRARY_PATH").unwrap_or("N/A".to_string())
);
... 并运行 cargo run --bin mybin
。你应该看到这样的东西:
DYLD_LIBRARY_PATH=~/.rustup/toolchains/stable-x86_64-apple-darwin/lib
cargo run
为您注入(inject)这个环境变量。
从哪里可以获得正确的值(value)?运行 rustc --print sysroot
并将 /lib
附加到输出。
如果你想直接运行mybin
(没有cargo
),你可以这样做:
DYLD_LIBRARY_PATH="$(rustc --print sysroot)/lib:$DYLD_LIBRARY_PATH" target/debug/mybin
将类似的行添加到您的 run.py
脚本中:
import os
print('DYLD_LIBRARY_PATH: {}'.format(os.environ.get('DYLD_LIBRARY_PATH', 'N/A')))
如果它打印 N/A
,则 DYLD_LIBRARY_PATH
未设置。您可以用类似的方式解决此问题:
DYLD_LIBRARY_PATH="$(rustc --print sysroot)/lib:$DYLD_LIBRARY_PATH" python run.py
请注意,您不能为此使用系统 Python ...
$ echo $DYLD_LIBRARY_PATH
~/.rustup/toolchains/stable-x86_64-apple-darwin/lib:
$ /usr/bin/python run.py
DYLD_LIBRARY_PATH: N/A
Traceback (most recent call last):
File "./run.py", line 21, in <module>
lib = cdll.LoadLibrary(lib_path)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 443, in LoadLibrary
return self._dlltype(name)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 365, in __init__
self._handle = _dlopen(self._name, mode)
OSError: dlopen(./target/debug/libmylib.dylib, 6): Library not loaded: @rpath/libstd-d4fbe66ddea5f3ce.dylib
Referenced from: /Users/robertvojta/Work/bar/target/debug/libmylib.dylib
Reason: image not found
...但是您可以使用通过 brew
安装的,例如 ...
$ echo $DYLD_LIBRARY_PATH
/Users/robertvojta/.rustup/toolchains/stable-x86_64-apple-darwin/lib:
$ /usr/local/bin/python run.py
DYLD_LIBRARY_PATH: /Users/robertvojta/.rustup/toolchains/stable-x86_64-apple-darwin/lib:
原因是SIP。 SIP 是在 El Capitan 中引入的,它可能会妨碍您。您可以体验以下内容:
$ env | grep DYLD
$ echo $DYLD_LIBRARY_PATH
/Users/robertvojta/.rustup/toolchains/stable-x86_64-apple-darwin/lib:
这是 SIP description页。 SIP保护/usr
、/bin
、/sbin
等文件夹,但不保护/usr/local
例如。
这是什么意思? SIP 做了很多事情,但其中之一是破坏 DYLD_LIBRARY_PATH
值。 Shebang 线像 ...
#!/usr/bin/env python
#!/usr/bin/python
...不会为你工作。您必须使用未安装在系统(和 protected )文件夹中的 Python 解释器。通过 brew
安装一个,安装 Anaconda,...
可以禁用 SIP,但不要这样做。
解决此问题的另一种方法是通过 install_name_tool
(man install_name_tool
)。更多信息在 Why is install_name_tool and otool necessary for Mach-O libraries in Mac Os X? .
例子:
$ otool -L target/debug/mybin
target/debug/mybin:
/Users/robertvojta/Work/bar/target/debug/deps/libmylib.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libstd-d4fbe66ddea5f3ce.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
/usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0)
$ install_name_tool -change @rpath/libstd-d4fbe66ddea5f3ce.dylib /Users/robertvojta/.rustup/toolchains/stable-x86_64-apple-darwin/lib/libstd-d4fbe66ddea5f3ce.dylib target/debug/libmylib.dylib
$ otool -L target/debug/libmylib.dylib
target/debug/libmylib.dylib:
/Users/robertvojta/Work/bar/target/debug/deps/libmylib.dylib (compatibility version 0.0.0, current version 0.0.0)
/Users/robertvojta/.rustup/toolchains/stable-x86_64-apple-darwin/lib/libstd-d4fbe66ddea5f3ce.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
/usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0)
$ /usr/bin/python run.py
DYLD_LIBRARY_PATH: N/A
Hallo
如您所见,现在没有 @rpath
,DYLD_LIBRARY_PATH
未设置,但它有效(Hallo
是通过 hallo
函数来自 libmylib.dylib
) 和系统 Python 解释器。
请注意一件事 - 例如,与 Linux 相比,macOS 动态库的行为有所不同。
如果你不想弄乱它,你可以将mylib
crate-type
更改为["rlib", "cdylib"]
,但这可能不是您想要的。
关于python - 在工作空间中编译时,dylib 无法加载 libstd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55282165/
运行 Tomcat 失败并出现 java.lang.OutOfMemoryError - 与缺少 PermGen 空间相关的错误。 我最近将 Tomcat 更改为以自己的用户(而非 root)运行。
我们有一个表,其中包含数百万行,其中包含 PostGIS 几何图形。我们要执行的查询是:落在边界几何内的最新条目是什么?这个查询的问题是我们经常会有大量的项目匹配边界框(半径大约为 5 公里),然后
我有一个Elasticsearch设置,它将允许用户搜索通配符作为索引。 array:3 [ "index" => "users" "type" => "user" "body" => arra
我创建了一个表,其中每行包含两个按钮,并且两个按钮连接在一起,我想将两个按钮分开。我用过 不起作用,css 也是,这是他们的另一种方式。 我有另一个问题,因为我不想在表格边框内显示操作按钮,而是在靠近
我试图在 jQuery Mobile 中的两个按钮之间留出空白。现实中的布局是这样的: Button 1 Button 2 (Hidden w/ display: none)
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
您好,我对图表应用程序还很陌生。现在我为我的应用程序创建了条形图。当我运行 create bar chart as separate project 时,输出如下所示。 然后当我将条形图与我的应用程序
我在使用 H2 和 GeoDB(内存中,junit)时遇到问题。 另外,使用 Hibernate 5(每个包的最新版本,包括 hibernate-spatial)和 Spring 4。 通过 id 实
我想画一张澳大利亚的 map ,并将每个城市表示为一个点。 然后突出显示人口众多(> 1M)的城市 library(sp) library(maps) data(canada.cities) head
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 6年前关闭。 Improve this
如何保持.txt文件中存在的空格?在.txt文件中,它表示: text :text text1 :text1 text23 :text2 text345 :text3 如果我写这段
以下哪个键最大? 选项 1:16 个数字 [0,9] 选项 2:30 个元音 选项 3:字母表中的 16 个字母 选项 4:32 位 有人可以帮助我,告诉我哪一个是正确的答案以及我们如何计算它吗?我知
在 Unity 3d 中使用 Azure 空间 anchor 来实现在 iOS 和 Android 上部署的室内和室外增强现实体验是否有益? 最佳答案 是的,对于 Azure Spatial Anch
我有一个绝对定位的圆形图像。图像只需占据屏幕宽度的 17%,并且距离顶部 5 个像素。 问题是,当我调整图像大小以占据屏幕宽度的 17% 时,它会这样做,但同时容器会变长。图像本身不会拉伸(stret
我在 Ubuntu 14.04 上使用 Cassandra。从文档中,我可以看到运行命令: nodetool snapshot 创建我的 key 空间的快照。 命令的输出是: nodetool sn
Heroku引入了“私有(private)空间”,是否可以将现有应用迁移到私有(private)空间? https://blog.heroku.com/archives/2015/9/10/herok
是否允许在语义记录中使用非绑定(bind)空格 或其他 HTML 编码字符?我遇到的问题是 ; 字符被软件视为记录的结尾。 例如:假设我有一份婚姻记录,其中包含 2 个结婚者的姓氏、结婚年份以及结
我正在研究“智能 parking ”项目,偶然发现了包含我们真正需要的YouTube视频。我们已经实现了第一部分,即从视频源进行实时透视变换,下一步是将其定义为一组矩形 我基本上需要知道他是如何做到的
我有两个类:Engine 和 Trainset(多个单元),这两个类共享其 ID 空间,其中包含名称和系列 id=- . 这是我的Engine类(它是抽象的,因为有引擎的子类型(DieselEngin
如果有人能帮助我,那就太好了。 我正在尝试使用Java的Split命令,使用空格分割字符串,但问题是,字符串可能没有空格,这意味着它将只是一个简单的顺序(而不是“输入2”将是“退出”) Scanner
我是一名优秀的程序员,十分优秀!