【发布时间】:2018-07-22 12:56:18
【问题描述】:
首先我使用的是 Mac OSX 10.12.6。
我想在我的 C 应用程序中嵌入一个 python 环境。 我在https://github.com/python/cpython 获取了 github python 项目并设法使用它的配置文件和命令行对其进行编译:
env LINKFORSHARED="-Wl,-stack_size,1000000 -framework CoreFoundation"
LDFLAGS="-Wl,-syslibroot,$SDK -arch i386"
CFLAGS="-Os -isysroot $SDK -arch i386"
./configure MACOSX_DEPLOYMENT_TARGET=10.6 --disable-shared --prefix=$PYTHON_PATH --exec-prefix=$PYTHON_PATH -build=i386-darwin
make
make altinstall
($SDK 指向 Xcode.app 中的 MacOSX.sdk)
它给了我一个 32 位的 libPython.a 然后我为 64 位重做它并与
合并lipo -create libPython32.A libPython64.a libPython32-64.a
在我的 XCode 项目中,在 .xconfig 文件中,我使用以下命令导入 lib 和头文件:
OTHER_LDFLAGS = $(inherited) -lpython32-64;
USER_HEADER_SEARCH_PATHS = $(inherited) $(LIBS)/cpython35/include
LIBRARY_SEARCH_PATHS = $(inherited) $(LIBS)/cpython35/lib;
一切都找到了,我的项目编译了,没有看到任何问题。 然后在我的 python.c 文件中(我减少了这篇文章的路径,这就是为什么'...'):
wchar_t *stdProgramName = L".../LIBs/cpython35/bin/python3.5";
Py_SetProgramName(stdProgramName);
wchar_t *stdPythonHome = L".../LIBs/cpython35";
Py_SetPythonHome(stdPythonHome);
wchar_t *stdlib = L".../LIBs/cpython35/lib/python3.5.zip:.../LIBs/cpython35/lib/python3.5:.../LIBs/cpython35/lib/python3.5/plat-darwin:.../LIBs/cpython35/lib/python3.5/lib-dynload:.../LIBs/cpython35/lib/python3.5/site-packages";
Py_SetPath(stdlib);
Py_Initialize();
// Run something
PyRun_SimpleString("import sys; print(sys.path)");
//To this line it's work fine, all path are correcte but then
PyRun_SimpleString("import math;");
Py_Finalize();
数学库的导入不起作用,它给了我:
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: dlopen(.../LIBs/cpython35/lib/python3.5/lib-dynload/math.cpython-35m-darwin.so, 2): Symbol not found: _PyExc_MemoryError
Referenced from: .../LIBs/cpython35/lib/python3.5/lib-dynload/math.cpython-35m-darwin.so
Expected in: flat namespace
in .../LIBs/cpython35/lib/python3.5/lib-dynload/math.cpython-35m-darwin.so
我有点卡在这一点上寻找这个导入的解决方案!!!
【问题讨论】:
标签: python c xcode macos embed