我试图直接从源代码构建Python,没有管理员权限,并且在运行后:

出口CPPFLAGS ='-I / opt / sqlite-3.7.16.2 / include -I / opt / tk8.6.0 / include
-I / opt / tcl8.6.0 / include /'

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原型-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 / _tk​​inter.o

gcc -pthread -fPIC -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict原型-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 build / temp.linux-x86_64-2.7 / opt / python / src / Python-2.7.4 / Modules / 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 / _tk​​inter.so

*警告:由于导入“ _tkinter”失败,因此重命名失败:libtk8.6.so:无法打开共享库文件:没有此类文件或目录

奇怪的是,我可以看到libtk8.6.so 正如我用LDFLAGS指定的那样,它实际上就在/opt/tcl8.6.0/lib下。

为什么编译失败?

===============>>#1 票数:5 已采纳

当Python尝试导入_tkinter时,会在setup.py安装过程中发生此问题。 如果您查看功能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的以下lib路径

  • /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

有了这些,一切都正常了。

  ask by Amelio Vazquez-Reina translate from so

未解决问题?本站智能推荐: