From paboyoun at fhcrc.org  Fri Apr 24 19:38:17 2009
From: paboyoun at fhcrc.org (Patrick Aboyoun)
Date: Fri, 24 Apr 2009 10:38:17 -0700
Subject: [Rd] Managing DLLs with the same names in an R session
Message-ID: <49F1F909.3040504@fhcrc.org>

I am having a problem using two DLLs with the same name, but obviously 
located in different directories, in an R session. The troublesome 
package is the (Bioconductor) Rgraphviz package. It relies on (3rd party 
software) graphviz and imports functions from (Bioconductor) package 
graph. Unfortunately, the current stable release of graphviz for Windows

http://www.graphviz.org/pub/graphviz/stable/windows/graphviz-2.22.2.msi

contains a graph.dll in its bin directory. The situation is that 
Rgraphviz needs to link to the graph.dll from graphviz,

E:\paboyoun>..\biocbld\bbs-2.4-bioc\R\bin\R CMD build Rgraphviz
[...omitting output...]
** libs
  making DLL ...
[...omitting output...]
gcc -shared -s -o Rgraphviz.dll tmp.def LL_funcs.o Rgraphviz.o 
RgraphvizInit.o agopen.o agread.o agwr
ite.o bezier.o buildEdgeList.o buildNodeList.o doLayout.o 
graphvizVersion.o init.o -LC:/Graphviz2.22/
bin -lgvc -lgraph -lcdt -Le:/biocbld/bbs-2.4-bioc/R/bin -lR
[...omitting output...]

but at run time R dispatches to the graph.dll from the graph package to 
resolve the symbols.

R-2.9> Sys.which("graph.dll")
                        graph.dll
"C:\\GRAPHV~1.22\\bin\\graph.dll"
R-2.9> library(Rgraphviz)
Loading required package: graph
Loading required package: grid

<< Message box appears:  The procedure entry point agclose could not be 
located in the dynamic link library graph.dll >>

Running Rterm.exe through the DependencyWalker software, I see that the 
gvc.dll and cdt.dll graphviz libraries are properly loaded, but the 
graph.dll dependency of Rgraphviz.dll links to the graph.dll library 
from the graph package. I tried passing the DLLpath for graphviz to the 
library.dynam function call when loading Rgraphviz.dll in the .onLoad 
function within Rgraphviz and it had no effect. I also tried 
library.dynam.unload/dyn.unload-ing the graph.dll from the graph package 
and then loading the Rgraphviz.dll followed by the reloading of the 
graph.dll from the graph package and the graph.dll dependencies become 
broken to the point that a call out to a graph.dll results in a GPF.

Is is possible to manage DLLs with the same name from R or do I need to 
rename one of the DLL names to make them unique?

 > sessionInfo()
R version 2.9.0 (2009-04-17)
i386-pc-mingw32

locale:
LC_COLLATE=English_United States.1252;LC_CTYPE=English_United 
States.1252;LC_MONETARY=English_United
States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods
[8] base

other attached packages:
[1] graph_1.22.0

loaded via a namespace (and not attached):
[1] cluster_1.11.13 tools_2.9.0



Patrick



[Rd] Managing DLLs with the same names in an R session
Patrick Aboyoun