I'm trying to call Mathematica from C. I'm following the example https://mathematica.stackexchange.com/a/32864/14301 with http://reference.wolfram.com/mathematica/tutorial/MathLinkDeveloperGuide-Unix.html#725481284
The code I have is: mlcall.c (identical to what i linked)
#include
#include
int main(int argc, char *argv[]) {
MLENV env;
MLINK link;
int errno;
int packet;
env = MLInitialize(0);
/* consider using MLOpenString instead here: */
link = MLOpenArgcArgv(env, argc, argv, &errno);
MLActivate(link);
/* send 42+137 using the full form Plus[42, 137] */
MLPutFunction(link, "Plus", 2);
MLPutInteger(link, 42);
MLPutInteger(link, 137);
MLEndPacket(link);
/* get packets until we find a ReturnPacket or error */
while ((packet = MLNextPacket(link)) && packet != RETURNPKT)
MLNewPacket(link);
if (MLError(link))
printf("error.\n");
else {
int result;
MLGetInteger(link, &result); /* we know that the result is an integer in this case */
printf("result: %d\n", result);
}
return 0;
}
and makefile:
MLINKDIR = /opt/Mathematica-9.0/SystemFiles/Links/MathLink/DeveloperKit
SYS=Linux-x86-64
CADDSDIR = ${MLINKDIR}/${SYS}/CompilerAdditions
INCDIR = ${CADDSDIR}
LIBDIR = ${CADDSDIR}
MLLIB = ML64i3
EXTRALIBS = -lm -lpthread -lrt -lstdc++ # Set these with appropriate libs for your system.
mlcall: mlcall.c
$(CC) -O mlcall.c -I$(INCDIR) -L$(LIBDIR) -l${MLLIB} ${EXTRALIBS} -o $@
clean:
rm mlcall
Output of make is:
cc -O mlcall.c -I/opt/Mathematica-9.0/SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions -L/opt/Mathematica-9.0/SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions -lML64i3 -lm -lpthread -lrt -lstdc++ -o mlcall
So no errors, but when I try to run mlcall with either ./mlcall
or ./mlcall -linkmode launch -linkname "/usr/bin/MathKernel"
I get the following error:
./mlcall: error while loading shared libraries: libML64i3.so: cannot open shared object file: No such file or directory
I do have libML64i3.so
in the directory /opt/Mathematica-9.0/SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions -L/opt/Mathematica-9.0/SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions
and I also tried to copy it to the directory I was running mlcall
in. What should I do?
Answer
On Linux you can add the directory containing this library to LD_LIBRARY_PATH
.
A semi-automated way to do this from a command prompt is this:
MATHLINK=$(dirname $(readlink -f $(which math)))/../SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MATHLINK
You can use this merthod of detecting the location in a shell script that will start your program.
Comments
Post a Comment