I have trouble when loading a custom mylib.dylib
in python3.7 on 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
However exactly the same mylib.dylib
is loading successfully with exactly this python code on Mac OS X 10.15 Catalina. Moreover, exactly the same mylib
binary runs successfully on my Big Sur 11.1 when compiled as an executable, not as a shared library.
Detailed step-by-step description:
- I build a C++ code in a shared library using
bazel
on Mac OS X Big Sur 11.1:
bazel build :mylib.dylib
BUILD
file is:
cc_binary(
name = "mylib.dylib",
srcs = ["mylib.cc", "mylib.h", "mylib_external.cc", "mylib_external.h"],
deps = [
...some dependencies...
],
linkshared = 1,
)
.bazelrc
file is:
# 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
- Then I try to load it in 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()
And it gives me:
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
A possible solution to the same problem was discussed in this GitHub issue, but for me, changing DYLD_LIBRARY_PATH
does not work.
- I tried to set the path to
libgcc_ext.10.4.dylib
inlibquadmath.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
It might help because there is no /usr/lib/libSystem.B.dylib
on Big Sur 11.1 (so this file is not used I suppose), but instead it gives me a new error:
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
I also tried to
brew reinstall gcc
, before this action there was/usr/local/libSystem.B.dylib
instead offlat namespace
in the actual issue.There are some related issues: scipy, scipy.special, scipy._fblas, gdal2. Their solutions do not help, because usually, they are about re-installing the packages, and here I have my own package.
Eventually, I tried to set
CC=clang/g++/g++-10
when building with bazel. Unfortunately, it did not work.
Any suggestions and thoughts would be highly appreciated. Thank you in advance