首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中加载dylib在macOS上失败:‘`Symbol:___addtf3`

在python中加载dylib在macOS上失败:‘`Symbol:___addtf3`
EN

Stack Overflow用户
提问于 2021-02-02 18:03:41
回答 1查看 1.5K关注 0票数 3

在MacOSXBigSu11.1上加载python3.7中的自定义mylib.dylib时,我遇到了麻烦:

代码语言:javascript
运行
复制
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正在成功地加载MacOSX10.15Catalina上的python代码。此外,,在编译为可执行文件时,完全相同的mylib二进制文件在MyBigSur11.1上成功运行,而不是作为共享库运行。

详细一步一步的描述:

  1. 我在MacOSXBigSu11.1上使用C++构建了一个共享库中的bazel代码:
代码语言:javascript
运行
复制
bazel build :mylib.dylib

BUILD文件是:

代码语言:javascript
运行
复制
cc_binary(
    name = "mylib.dylib",
    srcs = ["mylib.cc", "mylib.h", "mylib_external.cc", "mylib_external.h"],
    deps = [
        ...some dependencies...
    ],
    linkshared = 1,
)

.bazelrc文件是:

代码语言:javascript
运行
复制
# 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
  1. 然后我尝试用python3.7装载它:
代码语言:javascript
运行
复制
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()

它给了我:

代码语言:javascript
运行
复制
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

这个GitHub问题中讨论了解决相同问题的可能方法,但对我来说,更改DYLD_LIBRARY_PATH不起作用。

  1. 我试图在libgcc_ext.10.4.dylib中设置libquadmath.0.dylib路径
代码语言:javascript
运行
复制
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 11.1上没有/usr/lib/libSystem.B.dylib (因此我认为这个文件没有使用),但是它给了我一个新的错误:

代码语言:javascript
运行
复制
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
  1. 我也是已尝试 to brew reinstall gcc,在这个操作之前,实际的问题是/usr/local/libSystem.B.dylib而不是flat namespace
  2. 有一些相关问题:枕骨scipy.special福布拉斯gdal2。他们的解决方案没有帮助,因为通常,他们是关于重新安装软件包,这里我有我自己的软件包。
  3. 最后,我尝试将CC=clang/g++/g++-10设置为带bazel的建筑。不幸的是,它没有起作用。

如有任何建议和想法,将不胜感激。提前谢谢你

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-02 20:23:42

根据评论中的建议@n.‘代词’,我尝试链接libgcc_s而不是libSystem:

代码语言:javascript
运行
复制
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。我在谷歌上搜索并找到了这就是答案,然后做了:

代码语言:javascript
运行
复制
brew link --overwrite gcc

然后,我所做的唯一一件事就是用bazel重新构建mylib.dylib,规则与以前完全相同,而且它起了作用!现在,库在python中加载,没有任何错误。非常感谢。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66015218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档