我正在尝试直接从源代码构建Python,没有管理员权限,并且在运行之后:
export CPPFLAGS =' - I / opt / sqlite-3.7.16.2 / include -I / opt / tk8.6.0 / include
-I /选择/ tcl8.6.0 /包含/export LDFLAGS =' - L / opt / sqlite-3.7.16.2 / lib -L / opt / tk8.6.0 / lib /
-L / opt / tcl8.6.0 / lib / ./configure --prefix = / path_to_python-2.7.4 --enable-shared'
然后
make
我得到以下内容:
建立'_tkinter'扩展
gcc -pthread -fPIC -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DWITH_APPINIT = 1 -I / usr / X11 / include -I。 -IInclude -I./Include -I / opt / sqlite / sqlite-3.7.16.2 / include -I / opt / tk8.6.0 / include -I / opt / tcl8.6.0 / include -I / usr / local / include - I / opt / python / src / Python-2.7.4 / Include -I / opt / python / src / Python-2.7.4 -c /opt/python/src/Python-2.7.4/Modules/_tkinter.c - o build / temp.linux-x86_64-2.7 / opt / python / src / Python-2.7.4 / Modules / _tkinter.o
gcc -pthread -fPIC -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DWITH_APPINIT = 1 -I / usr / X11 / include -I。 -IInclude -I./Include -I / opt / sqlite / sqlite-3.7.16.2 / include -I / opt / tk8.6.0 / include -I / opt / tcl8.6.0 / include -I / usr / local / include - I / opt / python / src / Python-2.7.4 / Include -I / opt / python / src / Python-2.7.4 -c /opt/python/src/Python-2.7.4/Modules/tkappinit.c - o build / temp.linux-x86_64-2.7 / opt / python / src / Python-2.7.4 / Modules / tkappinit.o
gcc -pthread -shared -L / opt / sqlite / sqlite-3.7.16.2 / lib -L / opt / tk8.6.0 / lib / -L / opt / tcl8.6.0 / lib / -L / opt / sqlite / sqlite-3.7.16.2 / lib -L / opt / tk8.6.0 / lib / -L / opt / tcl8.6.0 / lib / -I。 -IInclude -I./Include -I / opt / sqlite / sqlite-3.7.16.2 / include -I / opt / tk8.6.0 / include -I / opt / tcl8.6.0 / include build / temp.linux-x86_64-2.7 /opt/python/src/Python-2.7.4/Modules/_tkinter.o 建立/ temp.linux-x86_64-2.7的/ opt /蟒蛇/ src目录/ Python的2.7.4 /模块/ tkappinit.o -L / usr / X11 / lib -L / opt / sqlite / sqlite-3.7.16.2 / lib -L / opt / tk8.6.0 / lib / -L / opt / tcl8.6.0 / lib / -L / usr / local / lib -L。 -ltk8.6 -ltcl8.6 -lX11 -lpython2.7 -o build / lib.linux-x86_64-2.7 / _tkinter.so
* 警告:重命名“_tkinter”,因为导入失败:libtk8.6.so:无法打开共享对象文件:没有这样的文件或目录
奇怪的是我可以看到libtk8.6.so
。它实际上就在我/opt/tcl8.6.0/lib
指定的LDFLAGS
下。
为什么编译失败?
答案 0 :(得分:5)
当Python尝试导入setup.py
时,在_tkinter
中安装期间会发生此问题。如果您查看函数build_extension
,则会出现一个块:
imp.load_dynamic(ext.name, ext_filename)
此行尝试动态加载_tkinter
(使用动态共享库libtk8.6.so
)。因此,即使编译/链接工作,当Python测试模块时,它使用动态库,我在LD_LIBRARY_PATH
中没有tcl / lib和tk / lib。一旦我添加了这些,它一切正常。
总结:
我必须通过CPPFLAGS
/path_to/sqlite3/include
/path_to/tcl/include
/path_to/tk/include
通过LDFLAGS
/path_to/sqlite3/lib
/path_to/tcl/lib
/path_to/tk/lib
以及通过LD_LIBRARY_PATH
的以下lib路径:
/path_to/sqlite3/lib
/path_to/tcl/lib
/path_to/tk/lib
所有这一切,一切正常。