2013-04-15 81 views
5

我想直接从源代码构建Python,没有管理员权限,运行后:准备_tkinter和sqlite3的Python的安装(没有管理员权限)

出口CPPFLAGS =' - 我的/ opt /源码-3.7.16.2 /包括-I /选择/ tk8.6.0 /包括
-I /选择/ tcl8.6.0 /包括/ '

出口LDFLAGS =' - L /选择/源码-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严格走样 -g -02 - DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DWITH_APPINIT = 1 -I/usr/X11/include -I。 -I/include -I/opt/tcl8.6.0/include -I/usr/local/include - 包括-I/opt/sqlite/sqlite-3.7.16.2/include -I/opt/tk8.6.0/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-prototypes -DWITH_APPINIT = 1 -I/usr/X11/include -I。 -I/include -I/opt/tcl8.6.0/include -I/usr/local/include - 包括-I/opt/sqlite/sqlite-3.7.16.2/include -I/opt/tk8.6.0/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。 -I/include -I/opt/tcl8.6.0/include build/temp.linux-x86_64-2.7 -I/Include -I/opt/sqlite/sqlite-3.7.16.2/include -I/opt/tk8.6.0 /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建立/ lib.linux-x86_64-2.7/_tk​​inter.so

*警告:重命名 “_tkinter”,因为其导入失败:libtk8.6 .so:无法打开共享目标文件:没有这样的文件或目录

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

为什么编译失败?

回答

4

此问题发生在安装期间setup.py,当Python试图导入_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

以下LIB路径通过LDFLAGS

添加以下包括路径
  • /path_to/sqlite3/lib
  • /path_to/tcl/lib
  • /path_to/tk/lib

和下面的LIB路径通过LD_LIBRARY_PATH

  • /path_to/sqlite3/lib
  • /path_to/tcl/lib
  • /path_to/tk/lib

所有这一切,一切正常。

+0

在哪里编辑CPPFLAGS? –

相关问题