J'ai des problèmes lorsque je charge un fichier personnalisé mylib.dylib
en python3.7 sur Mac OS X Big Sur 11.1 :
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
Cependant exactement la même chose mylib.dylib
se charge avec succès avec exactement ce code python sur Mac OS X 10.15 Catalina. En outre, exactement la même chose mylib
Le binaire fonctionne avec succès sur mon Big Sur 11.1 lorsqu'il est compilé comme un exécutable, et non comme une bibliothèque partagée.
Description détaillée, étape par étape :
-
Je construis un code C++ dans une bibliothèque partagée en utilisant
bazel
sur Mac OS X Big Sur 11.1 :bazel build :mylib.dylib
BUILD
est :
cc_binary(
name = "mylib.dylib",
srcs = ["mylib.cc", "mylib.h", "mylib_external.cc", "mylib_external.h"],
deps = [
...some dependencies...
],
linkshared = 1,
)
.bazelrc
est :
# 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
-
J'essaie ensuite de le charger dans 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()
Et ça me donne :
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
Une solution possible au même problème a été discutée dans ce problème GitHub mais pour moi, changer DYLD_LIBRARY_PATH
ne fonctionne pas.
-
J'ai essayé de définir le chemin d'accès à
libgcc_ext.10.4.dylib
surlibquadmath.0.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
Ça pourrait aider parce qu'il n'y a pas /usr/lib/libSystem.B.dylib
sur Big Sur 11.1 (donc ce fichier n'est pas utilisé je suppose), mais au lieu de cela il me donne une nouvelle erreur :
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
-
J'ai aussi a essayé a
brew reinstall gcc
Avant cette action, il y avait/usr/local/libSystem.B.dylib
au lieu deflat namespace
dans le numéro actuel. -
Il y a quelques problèmes connexes : scipy , scipy.special , scipy._fblas , gdal2 . Leurs solutions ne sont d'aucune utilité, car elles consistent généralement à réinstaller les paquets, alors que j'ai mon propre paquet.
-
Finalement, j'ai essayé de mettre
CC=clang/g++/g++-10
quand construire avec bazel . Malheureusement, cela n'a pas fonctionné.
Toute suggestion ou réflexion serait très appréciée. Merci d'avance