我试图直接从源代码构建Python,没有管理员权限,并在运行后:
export 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
我得到以下内容:
building ‘_tkinter’ extension
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.ogcc -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.ogcc -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* WARNING: renaming “_tkinter” since importing it failed: libtk8.6.so: cannot open shared object file: No such file or directory
奇怪的是我可以看到libtk8.6.so.它实际上就在我用LDFLAGS指定的/opt/tcl8.6.0/lib下.
为什么编译失败了?
解决方法:
当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
有了这一切,一切都奏效了.
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!