5

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

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

导出 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 --启用共享'

进而

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 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/_tkinter.so

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

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

为什么编译失败?

4

1 回答 1

6

这个问题发生在安装过程中setup.py,当 Python 尝试导入时_tkinter。如果你看一下 function build_extension,有一个块说:

imp.load_dynamic(ext.name, ext_filename)

这一行尝试动态加载_tkinter (使用动态共享库libtk8.6.so)。因此,即使编译/链接工作正常,当 Python 测试模块时,它也会使用动态库,而且我在LD_LIBRARY_PATH. 一旦我添加了这些,一切都很好。

总之:我必须添加以下包含路径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

以及以下通过的库路径LD_LIBRARY_PATH

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

有了这一切,一切正常。

于 2013-04-18T18:00:08.790 回答