所以我一直致力于编译MySQL和MySQLclient-python的静态版本。到目前为止,我已经完全成功了,我试图理解MySQLclient-python所具有的libSystem.B.dylib依赖。
为了说清楚,MySQLclient-python是围绕MySQL C库的python包装器。这导致需要在使用之前编译MySQLclient-python。这个目前正在开发OS X 10.7,我的目标是创建一个MySQLclient-python的编译版本,它可以在OS X的多个版本上运行(捆绑libmysql已经处理好了)。现在,我正在编译MySQLclient-python非常好,它适用于10.7。但是,当它在10.8+上进行测试时,它会中断。要编译MySQLclient-python,我使用python 3.5并运行
python setup.py build
这会导致两件事情发生。首先,使用类似于this的命令编译_mysql.o对象文件。然后,使用this script编译共享对象文件。需要说明的是,这些命令主要由setup.py生成。
生成的构建具有结构
.
├── setup.py
└── build
├── _mysql.so
├── MySQLdb
└── _mysql_exceptions.py
现在,在运行时
$ otool -L _mysql.so
_mysql.so: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
它清楚地表明了对libSystem.B.dylib的依赖。现在依赖性一般不是问题,这在10.7上工作正常。我可以导入python模块并正确使用它。但是,当切换到10.11时,同一模块不产生:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "./MySQLdb/__init__.py", line 19, in <module>
import _mysql
ImportError: dlopen(./_mysql.so, 2): Symbol not found: __ZNSt8ios_base4InitD1Ev
Referenced from: ./_mysql.so
Expected in: flat namespace in ./_mysql.so
显然,我的第一个想法是依赖性存在问题。我确实相信这是问题所在。说实话,我不知道从哪里开始。显然,OS X强烈反对静态链接,所以我没有长时间研究它。为了再次清楚,我的目标只是能够在多个OS X平台(10.7-10.11)上使用它,这目前适用于10.7。有什么想法吗?