1

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 <mathlink.h>
#include <stdio.h>

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?

user1335014
  • 163
  • 6

1 Answers1

3

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.

Szabolcs
  • 234,956
  • 30
  • 623
  • 1,263
  • Thanks, this worked. Not that it matters, but is there any particular reason for not using two dirname-s or /../..? – user1335014 May 21 '14 at 16:23
  • @user1335014 Can you write out the command you're thinking of? To tell the truth, I'm not good at shell scripting. I had to use this in the past, figured it out then, then copied and pasted here. – Szabolcs May 21 '14 at 16:28
  • I think that $(dirname $(readlink -f $(which math)))/../SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions is equivalent to $(dirname $(dirname $(readlink -f $(which math))))/SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions and $(readlink -f $(which math))/../../SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAdditions. But as I said that it doesn't matter. I'm not that home in shell myself either and thought that there might be some detail in this that I don't understand. – user1335014 May 21 '14 at 16:44
  • @user1335014 Your first example looks correct. The second isn't though. That's because readlink does not return a directory name. It returns a file name. filename/.. makes no sense. – Szabolcs May 21 '14 at 18:58
  • @user1335014 Another think: readlink seems to work differently on different OS ... I wrote this for Linux, but on OS X (and I assume BSD) the -f option has a different meaning. – Szabolcs May 21 '14 at 19:00
  • Thanks for clearing it up. What confused me is that if you run echo $(readlink -f $(which math)) then it prints absolute path (in my case /opt/Mathematica-9.0/Executables/math). – user1335014 May 21 '14 at 19:23