在 macOS Big Sur 上,在 python 中加载 dylib 失败:`Symbol not found: ___addtf3`
Posted
技术标签:
【中文标题】在 macOS Big Sur 上,在 python 中加载 dylib 失败:`Symbol not found: ___addtf3`【英文标题】:Loading dylib in python fails on macOS Big Sur: `Symbol not found: ___addtf3` 【发布时间】:2021-02-02 18:03:41 【问题描述】:在 Mac OS X Big Sur 11.1 上的 python3.7 中加载自定义 mylib.dylib
时遇到问题:
OSError Traceback (most recent call last)
<ipython-input-7-21ad9f6d803b> in <module>
12 try:
---> 13 mylib = ctypes.CDLL(mylib_path)
14 except OSError:
~/opt/anaconda3/lib/python3.7/ctypes/__init__.py in __init__(self, name, mode, handle, use_errno, use_last_error)
363 if handle is None:
--> 364 self._handle = _dlopen(self._name, mode)
365 else:
OSError: dlopen(mylib.dylib, 6): Symbol not found: ___addtf3
Referenced from: /usr/local/opt/gcc/lib/gcc/10/libquadmath.0.dylib
Expected in: flat namespace
in /usr/local/opt/gcc/lib/gcc/10/libquadmath.0.dylib
然而完全相同的mylib.dylib
在 Mac OS X 10.15 Catalina 上使用此 python 代码成功加载。 此外,当编译为可执行文件而非共享库时,完全相同的 mylib
二进制文件在我的 Big Sur 11.1 上成功运行。
详细的分步说明:
-
我在 Mac OS X Big Sur 11.1 上使用
bazel
在共享库中构建 C++ 代码:
bazel build :mylib.dylib
BUILD
文件是:
cc_binary(
name = "mylib.dylib",
srcs = ["mylib.cc", "mylib.h", "mylib_external.cc", "mylib_external.h"],
deps = [
...some dependencies...
],
linkshared = 1,
)
.bazelrc
文件是:
# Basic build settings
build --jobs 128
build --define='absl=1'
build --enable_platform_specific_config
# macOS
build:macos --cxxopt=-std=c++17
build:macos --host_cxxopt=-std=c++17
build:macos --copt=-w
# Sets the default Apple platform to macOS.
build --apple_platform_type=macos
# Allow debugging with XCODE
build --apple_generate_dsym
build:darwin_x86_64 --apple_platform_type=macos
build:darwin_x86_64 --macos_minimum_os=10.12
build:darwin_x86_64 --cpu=darwin_x86_64
-
然后我尝试在python3.7中加载它:
import sys, platform
import ctypes, ctypes.util
mylib_path = ctypes.util.find_library("mylib")
if not mylib_path:
print("Unable to find the specified library.")
sys.exit()
try:
mylib = ctypes.CDLL(mylib_path)
except OSError:
print("Unable to load the specified library.")
sys.exit()
它给了我:
OSError Traceback (most recent call last)
<ipython-input-7-21ad9f6d803b> in <module>
12 try:
---> 13 mylib = ctypes.CDLL(mylib_path)
14 except OSError:
~/opt/anaconda3/lib/python3.7/ctypes/__init__.py in __init__(self, name, mode, handle, use_errno, use_last_error)
363 if handle is None:
--> 364 self._handle = _dlopen(self._name, mode)
365 else:
OSError: dlopen(mylib.dylib, 6): Symbol not found: ___addtf3
Referenced from: /usr/local/opt/gcc/lib/gcc/10/libquadmath.0.dylib
Expected in: flat namespace
in /usr/local/opt/gcc/lib/gcc/10/libquadmath.0.dylib
this GitHub issue 讨论了同一问题的可能解决方案,但对我来说,更改 DYLD_LIBRARY_PATH
不起作用。
-
我尝试在
libquadmath.0.dylib
中设置libgcc_ext.10.4.dylib
的路径:
install_name_tool -change /usr/lib/libSystem.B.dylib /usr/local/opt/gcc/lib/gcc/10/libgcc_ext.10.4.dylib /usr/local/opt/gcc/lib/gcc/10/libquadmath.0.dylib
这可能会有所帮助,因为 Big Sur 11.1 上没有 /usr/lib/libSystem.B.dylib
(所以我想这个文件没有被使用),但它给了我一个新错误:
OSError Traceback (most recent call last)
<ipython-input-7-21ad9f6d803b> in <module>
12 try:
---> 13 mylib = ctypes.CDLL(mylib_path)
14 except OSError:
~/opt/anaconda3/lib/python3.7/ctypes/__init__.py in __init__(self, name, mode, handle, use_errno, use_last_error)
363 if handle is None:
--> 364 self._handle = _dlopen(self._name, mode)
365 else:
OSError: dlopen(mylib.dylib, 6): Library not loaded: /usr/local/opt/gcc/lib/gcc/10/libgcc_ext.10.4.dylib
Referenced from: /usr/local/opt/gcc/lib/gcc/10/libquadmath.0.dylib
Reason: no suitable image found. Did find:
/usr/local/opt/gcc/lib/gcc/10/libgcc_ext.10.4.dylib: mach-o, but wrong filetype
/usr/local/Cellar/gcc/10.2.0/lib/gcc/10/libgcc_ext.10.4.dylib: mach-o, but wrong filetype
我也是tried到brew reinstall gcc
,在此操作之前,实际问题中是/usr/local/libSystem.B.dylib
而不是flat namespace
。
有一些相关问题:scipy、scipy.special、scipy._fblas、gdal2。他们的解决方案没有帮助,因为通常,他们是关于重新安装包,而这里我有自己的包。
最终,我尝试将CC=clang/g++/g++-10
设置为building with bazel。不幸的是,它不起作用。
任何建议和想法将不胜感激。提前谢谢你???
【问题讨论】:
___addtf3 是一个 gcc 运行时函数,通常定义在 libgcc_s 共享库中。你的自定义 dylib 是否引用了这个库? 谢谢!您的建议导致了解决方案,将在“答案”中详细描述。 【参考方案1】:关注@n。 '代词' m。来自 cmets 的建议,我尝试链接 libgcc_s 而不是 libSystem:
install_name_tool -change "/usr/lib/libSystem.B.dylib" "/usr/local/opt/gcc/lib/gcc/10/libgcc_s.1.dylib" mylib.dylib
它给了我另一个错误:来自 libopenblas 的Symbol not found: ___emutls_get_address
。我用谷歌搜索找到了this SO answer,然后:
brew link --overwrite gcc
然后我唯一做的就是用 bazel 重建 mylib.dylib
,其规则与之前完全相同,并且成功了!现在库在 python 中加载,没有任何错误。非常感谢。
【讨论】:
以上是关于在 macOS Big Sur 上,在 python 中加载 dylib 失败:`Symbol not found: ___addtf3`的主要内容,如果未能解决你的问题,请参考以下文章
无法在 macOS Big Sur 上执行 Flutter 应用程序
在 MacOS Big Sur 上使用 perl WWW:Mechanize