they could not be imported: _sqlite3 /Python3.6 / CentOS6 - python-3.x

Environment
# cat /etc/redhat-release
CentOS release 6.8 (Final)
$ which python3.6
/usr/local/bin/python3.6
# find /usr/local -name _sqlite3.so
/usr/local/lib/python2.7/lib-dynload/_sqlite3.so
# yum install sqlite-devel
When I usr SQLite3, Error occurred
No module named '_sqlite3'
I decided to build it from source again.
# ./configure --enable-shared --prefix=/usr/local LDFLAGS="-Wl,-rpath /usr/local/lib" --with-sqlite=/usr/local/lib/python2.7/lib-dynload/_sqlite3.so
# make
Python build finished successfully!
Following modules built successfully but were removed because they
could not be imported:
_sqlite3
・Why?

/usr/local/lib/python2.7/lib-dynload/_sqlite3.so is the Python 2 Python wrapper module and not the actual SQLite library. Moreover, --with-sqlite should point to the headers, not the shared library. Compilation requires the headers, the dynamic library is located at runtime.
Not that you need to use --with-sqlite once you installed the sqlite-devel headers; those are put in a default location that the Python configure script knows how to find, in usr/include. Only if you have headers in a non-default location would you use that option to point to the directory holding the sqlite3.h and sqlite3ext.h headers.
Once compiled, the sqlite3 Python module loads the _sqlite3*.so extension module (the exact name differs with the exact Python 3 release and platform), and the dynamic loader will find the right libsqlite3.so version.

Related

Rust import PAM C functions

I'm trying to figure out how to write a Linux PAM in Rust and I've started with this repo. When I compile it with --features libpam (which enables #[link(name="pam")] that imports external C functions), the compiler complains:
error: linking with `cc` failed: exit status: 1
...
note: /usr/bin/ld: cannot find -lpam: No such file or directory
Looking around SO, I've realized that the pam library was not found to be linked. However, I just cannot figure out how to either install it (I can find many libpam-something packages, but no libpam) or locate it such that I can indicate to the compiler/linker where to find it.
When I look into other crates that also work with PAM, they all import the C functions using #[link(name="pam")], and none specifies how to make it work.
I'm using Ubuntu 22.04.
The necessary headers for PAM library can be installed on Ubuntu as part of libpam0g-dev package (link for jammy):
sudo apt install libpam0g-dev
Debian package has the same name (so sudo apt-get install libpam0g-dev), CentOS uses pam-devel package for that (sudo yum install pam-devel).
Alternatively, on any platform you can use the source code from github and follow the installation instructions from README.

Building and using a newer GLIBC on CentOS 7

I use CentOS 7 and would like to use some Anaconda python package that requires GLIBC_2.18 while the host OS only provides 2.17. I tried compiling a newer version of glibc myself following these instructions. When I try to run any executable with this newer glibc I am getting an error:
$ ./testrun.sh ls
ls: error while loading shared libraries: ls: cannot open shared object file: No such file or director
Is there a workaround for this issue?
Update 1:
As per suggestion in this answer I needed to specify the full path to the executable, which now gives a different error message:
$ cd glibc-2.20/build # build directory
$ ./testrun.sh /bin/ls
/bin/ls: error while loading shared libraries: libselinux.so.1: cannot open shared object file: No such file or directory
Update 2:
Adding paths to the system libraries in testrun.sh solved the problem. I can not only run ls but also the aforementioned python package. Thank you!
Try ./testrun.sh /bin/ls.
That said, you will really be better off building the Python package for your system, instead of trying to make non-system GLIBC, as Danila Vershinin suggested.
Update:
libselinux.so.1: ...: No such file or directory
The testrun.sh for the new GLIBC does not look in system directories (e.g. /usr/lib64). You need to append system directories to the --library-path it uses. E.g. change
--library-path "${builddir}":"${builddir}"/math:"${builddir}"/elf:"${builddir}"/dlfcn:"${builddir}"/nss:"${builddir}"/nis:"${builddir}"/rt:"${builddir}"/resolv:"${builddir}"/mathvec:"${builddir}"/support:"${builddir}"/crypt:"${builddir}"/nptl
to:
--library-path "${builddir}":"${builddir}"/math:"${builddir}"/elf:"${builddir}"/dlfcn:"${builddir}"/nss:"${builddir}"/nis:"${builddir}"/rt:"${builddir}"/resolv:"${builddir}"/mathvec:"${builddir}"/support:"${builddir}"/crypt:"${builddir}"/nptl:/usr/lib64:/lib64
(or something like that).

Cabal don't find relative library for compilation of gsasl package

I'm using Haskell on webfaction server, with non root access, on a CentOS 6 system.
I have a /lib/ folder which contain libraries.
Actually, i have a problem with some libraries needed for an installation of package using cabal install.
I need the libgsasl library installed, so i download and compile the gsasl package from sources :
I wget the latest tar.gz here
I run ./configure --prefix=$HOME to install compiled libraries into $HOME/lib
i make and make install
Next, i try two way with cabal install gsasl command, which actually fails :
export LD_LIBRARY_PATH=$HOME/lib:$LD_LIBRARY_PATH
cabal install gsasl --bindir=$HOME/bin --extra-include-dirs=/home/reyman64/lib/ --extra-lib-dirs=/home/reyman64/lib
Any of the command found the good libraries ...
The pkg-config package 'libgsasl' version superior to 1.1 is required but it could not be found.
So i verify, my version is 1.8, and i have the libgsasl.sa .la .so .so.7 .so.7.9.6 in $HOME/lib and i have a libgsasl.pc into $home/lib/pkgconfig
Any idea of the problem ?
Make sure your PKG_CONFIG_PATH environment variable is set to include $HOME/lib/pkgconfig, i.e. the directory where you've placed libgsasl.pc.

python 2.7.5 failed to build module when install the gentoo prefix

I tried to install the gentoo prefix on my lfs 32bit. But it comes error:
Python build finished, but the necessary bits to build these modules
were not found:
_bsddb _sqlite3 _tkinter bsddb185 dl nis sunaudiodev
To find the necessary bits, look in setup.py in detect_modules() for
the module's name.
Failed to build these modules: crypt
It comes in the last step emerge -e system.
If you need any question. Please tell me.
Try this: mv $EPREFIX/tmp/usr/lib/libpython2.7.a $EPREFIX/tmp/usr/lib/_libpython2.7.a as mentioned from the following link:
http://forums.gentoo.org/viewtopic-t-890016-start-0.html
Also look at this post for resolving some of the modules if the above doesn't work:
http://www.kelvinwong.ca/tag/python-2-7/

GCC 4.7.2 requires ppl?

I'm trying to configure GCC 4.7.2, but it's failing with configure: error: Unable to find a usable PPL
I've looked in GCC prerequisites page and PPL isn't mentioned anywhere.
I'm using CLooG 0.17.0, which uses ISL, and as such no longer requires PPL (as far as I can tell)
Is there some other requirement on PPL in GCC which means I still need PPL, or am I missing some flag from my configure line?
I am passing the following options to configure:
--enable-cloog-backend=isl
--with-cloog=$PREFIX
--with-isl=$PREFIX
--with-gmp=$PREFIX
--with-mpfr=$PREFIX
--with-mpc=$PREFIX
For completeness, my full configure line is as follows:
./configure --prefix=/hostname/tmp/syddev/sdk/gcc472/suse11/x86_64 \
--disable-multilib --enable-cloog-backend=isl \
--with-mpc=/hostname/tmp/syddev/sdk/gcc472/suse11/x86_64 \
--with-mpfr=/hostname/tmp/syddev/sdk/gcc472/suse11/x86_64 \
--with-gmp=/hostname/tmp/syddev/sdk/gcc472/suse11/x86_64 \
--with-isl=/hostname/tmp/syddev/sdk/gcc472/suse11/x86_64 \
--with-cloog=/hostname/tmp/syddev/sdk/gcc472/suse11/x86_64 \
--build=x86_64-suse-linux --with-pkgversion='SIG build 11/27/2012' \
--with-gxx-include-dir=/hostname/tmp/syddev/sdk/gcc472/suse11/x86_64/include/c++/4.7.2 \
--enable-version-specific-runtime-libs
Update:
In order to try make forward progress I decided to add PPL to my installation list, and add --with-ppl=$PREFIX to my configure line.
Configure still fails with configure: error: Unable to find a usable PPL
It seems this is a bug in the configure script: Configure fails if PPL_MINOR_VERSION < 11
With the latest version PPL_MINOR_VERSION=0 (and PPL_MAJOR_VERSION=1)
The GCC Prerequisites page jumped the gun and is showing the prerequisites for GCC 4.8.
GCC 4.7.2 still uses PPL instead of ISL, as evidenced by the lack of --with-isl=PATH in the output of configure:
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-build-libsubdir=DIR Directory where to find libraries for build system
--with-mpc=PATH specify prefix directory for installed MPC package.
Equivalent to --with-mpc-include=PATH/include plus
--with-mpc-lib=PATH/lib
--with-mpc-include=PATH specify directory for installed MPC include files
--with-mpc-lib=PATH specify directory for the installed MPC library
--with-mpfr-dir=PATH this option has been REMOVED
--with-mpfr=PATH specify prefix directory for installed MPFR package.
Equivalent to --with-mpfr-include=PATH/include plus
--with-mpfr-lib=PATH/lib
--with-mpfr-include=PATH
specify directory for installed MPFR include files
--with-mpfr-lib=PATH specify directory for the installed MPFR library
--with-gmp-dir=PATH this option has been REMOVED
--with-gmp=PATH specify prefix directory for the installed GMP
package. Equivalent to
--with-gmp-include=PATH/include plus
--with-gmp-lib=PATH/lib
--with-gmp-include=PATH specify directory for installed GMP include files
--with-gmp-lib=PATH specify directory for the installed GMP library
--with-host-libstdcxx=L use linker arguments L to link with libstdc++ when
linking with PPL
--with-stage1-ldflags=FLAGS
linker flags for stage1
--with-stage1-libs=LIBS libraries for stage1
--with-boot-libs=LIBS libraries for stage2 and later
--with-boot-ldflags=FLAGS
linker flags for stage2 and later
--with-ppl=PATH specify prefix directory for the installed PPL
package. Equivalent to
--with-ppl-include=PATH/include plus
--with-ppl-lib=PATH/lib
--with-ppl-include=PATH specify directory for installed PPL include files
--with-ppl-lib=PATH specify directory for the installed PPL library
--with-cloog=PATH Specify prefix directory for the installed CLooG-PPL
package. Equivalent to
--with-cloog-include=PATH/include plus
--with-cloog-lib=PATH/lib
--with-cloog-include=PATH
Specify directory for installed CLooG include files
--with-cloog-lib=PATH Specify the directory for the installed CLooG
library
--with-build-sysroot=SYSROOT
use sysroot as the system root during the build
--with-debug-prefix-map='A=B C=D ...'
map A to B, C to D ... in debug information
--with-build-config='NAME NAME2...'
use config/NAME.mk build configuration
--with-build-time-tools=PATH
use given path to find target tools during the build
It's unfortunate that they don't maintain prerequisites pages for versions prior to 4.8.

Resources