digitalmars.D - loading D into R in OSX. Dynamic libraries problem
- Michael (45/45) Jun 26 2010 I'm probably trying to complicate things too much while not really
- Jacob Carlborg (8/53) Jun 26 2010 First, have you built Tango as a dynamic library, using "bob" with the
- Michael (10/17) Jun 26 2010 Thank you! That worked! Just to explain what I did.
I'm probably trying to complicate things too much while not really
understanding what I'm doing... I want to be able to call D code from R. (R is
a language for doing statistics)
When I try to load the code, I get an error:
dlopen( PATH/test.so, 6): Symbol not found: __minfo_beg
what I did is the following: I have a small D program:
--
import tango.io.Stdout;
extern (C) void Dfunc()
{
Stdout("got to D").newline ;
}
--
I compile it with
dmd -fPIC -c test.d
then I make it into a dynamic library:
R CMD SHLIB /usr/local/lib/libtango-user-dmd.a
/usr/local/lib/libtango-base-dmd-d.a test.o
which calls:
gcc -arch i386 -std=gnu99 -dynamiclib -Wl,-headerpad_max_install_names
-mmacosx-version-min=10.4 -undefined dynamic_lookup -single_module
-multiply_defined suppress -L/usr/local/lib -o test.so test.o
/usr/local/lib/libtango-user-dmd.a /usr/local/lib/libtango-base-dmd-d.a
-F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework
-Wl,CoreFoundation
then I load the dynamic library into R, and get the above error.
dyn.load("test.so")
The equivalent in C works well:
--
#include <stdio.h>
void test()
{
printf("got to C\n") ;
}
--
gcc -fPIC -c test.c
R CMD SHLIB test.o
which calls:
gcc -arch i386 -std=gnu99 -dynamiclib -Wl,-headerpad_max_install_names
-mmacosx-version-min=10.4 -undefined dynamic_lookup -single_module
-multiply_defined suppress -L/usr/local/lib -o test.so test.o
-F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework
-Wl,CoreFoundation
At this point loading the resulting dynamic library from R causes no problems.
What am I doing wrong, other than trying to complicate things?
Jun 26 2010
On 2010-06-26 11:59, Michael wrote:
I'm probably trying to complicate things too much while not really
understanding what I'm doing... I want to be able to call D code from R. (R is
a language for doing statistics)
When I try to load the code, I get an error:
dlopen( PATH/test.so, 6): Symbol not found: __minfo_beg
what I did is the following: I have a small D program:
--
import tango.io.Stdout;
extern (C) void Dfunc()
{
Stdout("got to D").newline ;
}
--
I compile it with
dmd -fPIC -c test.d
then I make it into a dynamic library:
R CMD SHLIB /usr/local/lib/libtango-user-dmd.a
/usr/local/lib/libtango-base-dmd-d.a test.o
which calls:
gcc -arch i386 -std=gnu99 -dynamiclib -Wl,-headerpad_max_install_names
-mmacosx-version-min=10.4 -undefined dynamic_lookup -single_module
-multiply_defined suppress -L/usr/local/lib -o test.so test.o
/usr/local/lib/libtango-user-dmd.a /usr/local/lib/libtango-base-dmd-d.a
-F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework
-Wl,CoreFoundation
then I load the dynamic library into R, and get the above error.
dyn.load("test.so")
The equivalent in C works well:
--
#include<stdio.h>
void test()
{
printf("got to C\n") ;
}
--
gcc -fPIC -c test.c
R CMD SHLIB test.o
which calls:
gcc -arch i386 -std=gnu99 -dynamiclib -Wl,-headerpad_max_install_names
-mmacosx-version-min=10.4 -undefined dynamic_lookup -single_module
-multiply_defined suppress -L/usr/local/lib -o test.so test.o
-F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework
-Wl,CoreFoundation
At this point loading the resulting dynamic library from R causes no problems.
What am I doing wrong, other than trying to complicate things?
First, have you built Tango as a dynamic library, using "bob" with the
"-d" flag? Oh I see now that you use an older version of Tango. Download
the latest version from trunk and use "bob" with the "-d" flag to build
Tango as a dynamic library. Then you should be able to build dynamic
libraries. BTW the "-fPIC" flag is not necessary on Mac, it's on by default.
--
/Jacob Carlborg
Jun 26 2010
== Quote from Jacob Carlborg (doob me.com)'s articleFirst, have you built Tango as a dynamic library, using "bob" with the "-d" flag? Oh I see now that you use an older version of Tango. Download the latest version from trunk and use "bob" with the "-d" flag to build Tango as a dynamic library. Then you should be able to build dynamic libraries. BTW the "-fPIC" flag is not necessary on Mac, it's on by default.Thank you! That worked! Just to explain what I did. svn co http://svn.dsource.org/projects/tango/trunk cd trunk/ ./build/script/bob.rb -vu -d . That created libtango.dylib, and linking with that library was successful. R CMD SHLIB /usr/local/lib/libtango.dylib test.o and in R:dyn.load("test.so") .C("Dfunc")got to D Thanks!
Jun 26 2010








Michael <lachmann eva.mpg.de>