Skip to content

Instantly share code, notes, and snippets.

@gaow
Last active April 10, 2018 01:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gaow/39902e16603ffbe185ae38ff062fa266 to your computer and use it in GitHub Desktop.
Save gaow/39902e16603ffbe185ae38ff062fa266 to your computer and use it in GitHub Desktop.
How I got rpy2 linked to libR.so

Setup

  1. Python: version 3.6 provided by latest miniconda3, installed to /opt
  2. R: Microsoft Open R version 3.4.2, installed to /opt
  3. rpy2: version 2.9.2

Procedures

  1. Do not install from conda. At least try installing from pip. Even better, download the source code and run python setup.py install
  2. Initial installation failed, complaining something about RBuild.h not found. To fix, add in ~/.bashrc or export to bash something like:
export CPLUS_INCLUDE_PATH=/opt/microsoft/ropen/3.4.2/lib64/R/include:$HOME/R/x86_64-pc-linux-gnu-library/3.3/Rcpp/include
export C_INCLUDE_PATH=/opt/microsoft/ropen/3.4.2/lib64/R/include:$HOME/R/x86_64-pc-linux-gnu-library/3.3/Rcpp/include                               
  1. Installation works for me, but after that python -m "rpy2.tests" failed with
/miniconda3/lib/python3.6/site-packages/rpy2-2.9.2-py3.6-linux-x86_64.egg/rpy2/rinterface/_rinterface.cpython-36m-x86_64-linux-gnu.so: undefined symbol: R_NilValue

Checking on this file:

$ ldd _rinterface.cpython-36m-x86_64-linux-gnu.so

	linux-vdso.so.1 (0x00007ffef73ec000)
	libpython3.6m.so.1.0 => /home/gaow/Public/miniconda3/lib/libpython3.6m.so.1.0 (0x00002b7c3a205000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00002b7c3a72c000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00002b7c3a949000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00002b7c3ace8000)
	libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00002b7c3aeee000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00002b7c3b0f1000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00002b7c3b2f9000)
	/lib64/ld-linux-x86-64.so.2 (0x000055abdbd09000)

Obviously libR.so is not linked.

  1. Tried to set proper LD_LIBRARY_PATH, did not work.
  2. Removed installation intermediate output and run installer again:
rm -rf dist build 
python setup.py install

and read the screen output I locked on these lines:

gcc -pthread -shared -L/miniconda3/lib -Wl,-rpath=/miniconda3/lib,--no-as-needed build/temp.linux-x86_64-3.6/./rpy/rinterface/_rinterface.o -L/miniconda3/lib -Lbuild/temp.linux-x86_64-3.6 -lpython3.6m -lr_utils -o build/lib.linux-x86_64-3.6/rpy2/rinterface/_rinterface.cpython-36m-x86_64-linux-gnu.so
gcc -pthread -shared -L/miniconda3/lib -Wl,-rpath=/miniconda3/lib,--no-as-needed build/temp.linux-x86_64-3.6/./rpy/rinterface/_rpy_device.o -L/miniconda3/lib -Lbuild/temp.linux-x86_64-3.6 -lpython3.6m -lr_utils -o build/lib.linux-x86_64-3.6/rpy2/rinterface/_rpy_device.cpython-36m-x86_64-linux-gnu.so

I added -L/opt/microsoft/ropen/3.4.2/lib64/R/lib -lR to them, and run:

gcc -pthread -shared -L/miniconda3/lib -Wl,-rpath=/miniconda3/lib,--no-as-needed build/temp.linux-x86_64-3.6/./rpy/rinterface/_rinterface.o -L/miniconda3/lib -Lbuild/temp.linux-x86_64-3.6 -lpython3.6m -lr_utils -lR -L/opt/microsoft/ropen/3.4.2/lib64/R/lib -o build/lib.linux-x86_64-3.6/rpy2/rinterface/_rinterface.cpython-36m-x86_64-linux-gnu.so
gcc -pthread -shared -L/miniconda3/lib -Wl,-rpath=/miniconda3/lib,--no-as-needed build/temp.linux-x86_64-3.6/./rpy/rinterface/_rpy_device.o -L/miniconda3/lib -Lbuild/temp.linux-x86_64-3.6 -L/opt/microsoft/ropen/3.4.2/lib64/R/lib -lpython3.6m -lr_utils -lR -o build/lib.linux-x86_64-3.6/rpy2/rinterface/_rpy_device.cpython-36m-x86_64-linux-gnu.so

Then I check them:

$ ldd build/lib.linux-x86_64-3.6/rpy2/rinterface/_rpy_device.cpython-36m-x86_64-linux-gnu.so
	linux-vdso.so.1 (0x00007fff67190000)
	libpython3.6m.so.1.0 => /home/gaow/Public/miniconda3/lib/libpython3.6m.so.1.0 (0x00002b20d3df7000)
	libR.so => /opt/microsoft/ropen/3.4.2/lib64/R/lib/libR.so (0x00002b20d42fe000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00002b20d6405000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00002b20d6622000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00002b20d69c3000)
	libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00002b20d6bc7000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00002b20d6dca000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00002b20d6fd2000)
	libRblas.so => /opt/microsoft/ropen/3.4.2/lib64/R/lib/libRblas.so (0x00002b20d72d6000)
	libgfortran.so.1 => /opt/microsoft/ropen/3.4.2/lib64/R/lib/libgfortran.so.1 (0x00002b20da7f5000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00002b20daa8e000)
	libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00002b20dae10000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00002b20db03d000)
	/lib64/ld-linux-x86-64.so.2 (0x000055abe1374000)

looking good.

  1. Run again:
python setup.py install

then

python -m "rpy2.tests"

to see it work.

Update

this issue is related to a bug in Microsoft openR recently discussed. See this post.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment