[Phylobase-devl] Rcpp and OS X compiliation

Mark Holder mtholder at ku.edu
Tue Jan 19 22:57:24 CET 2010

Hi folks,
	Dirk, Romain Francois, Simon Urbanek, and I have had some more off- 
thread email exchanges about this issue.  I think that it is now  

Speaking for the phylo-informatics community, I'd like to sincerely  
thank Dirk, Romain, and Simon for all of the help getting this sorted  

The long term solution:
	Dirk and Romain are going to release Rcpp 0.7.3 soon. This version  
will cause phylobase to statically link to libRcpp. No changes to  
phylobase are required.

The short term solutions. Either:
	1. install Rcpp and phylobase from source, or
	2. augment your dynamic library loading path (for example add $HOME/ 
Library/R/2.10/library/Rcpp/lib/i386 to the list of directories in the  
DYLD_LIBRARY_PATH environmental variable on Mac).

Below I summarize the issues for those who are curious.

all the best,

The gory details (as I understand them):

1. shared (or "dynamic") libraries contain a path to their location.   
I think that this field can also be just the name, but by default it  
is the full path.  (On Mac, "otool -L libNAMEHERE.so"  lists this  
location. install_name_tool can be used to update this info).

2. executables or other libraries that link to a dylib store the path  
that the library lists for itself.  This info is used by the loader at  
runtime to find all of the object code that the calling code uses.

3. If the loader finds a library with the correct name in its search,  
then it will load the library (even if the calling library incorrectly  
lists its own location).  So the loading is robust to moving the  
library, if you move it to a directory that is on the search path (it  
still not a great idea to move your dynamic libraries after linking to  

So, if phylobase was linked against libRcpp that was at /x/lib/ 
libRcpp.dylib (and libRcpp lists its own location as "/x/lib/ 
libRcpp.dylib") then when phylobase loads, it will be able to load the  
functions supplied by libRcpp:	
	- if libRcpp is still at /x/lib/libRcpp.dylib, OR
	- if there is a library called libRcpp.dylib in the directories that  
are always searched (eg. those libraries listed in DYLD_LIBRARY_PATH,  
or those directories that R specifies to the loader).

4. There is no binary package installation hook that would allow a  
dynamic library to be modified when it is installed via the  
install.packages mechanism.   So calling something like  
install_name_tool as part of package installation so that each library  
lists the correct (installed) location for itself is not an option.

Thus, when a binary form of phylobase was installed, it would refer to  
a path to libRcpp.dylib that does not exist on the user's machine (it  
will be a  a path on the build machine's filesystem).  So binary  
installs of phylobase  were brittle.

Furthermore, if one uses install.packages to install Rcpp, then the  
library that you download will have the wrong path listed for its own  
location.  If you then build phylobase against this version of the  
library, the build and link will work but the loader will look in the  
wrong place for the library (and the library(phylobase) call will fail).

The most robust solution seems to be static linking of Rcpp into  
phylobase.  After a statically-linked version of pyhlobase.so is  
created, then phylobase will no longer need to find libRcpp.*

Building from source also works because then all of the libraries list  
their own locations correctly.

Mark Holder

mtholder at ku.edu

Department of Ecology and Evolutionary Biology
University of Kansas
6031 Haworth Hall
1200 Sunnyside Avenue
Lawrence, Kansas 66045

lab phone:  785.864.5789

fax (shared): 785.864.5860

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.r-forge.r-project.org/pipermail/phylobase-devl/attachments/20100119/e92c92cd/attachment.htm 

More information about the Phylobase-devl mailing list