Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I'm trying to call Mathematica from C. I'm following the example http://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?

share|improve this question

1 Answer 1

up vote 1 down vote accepted

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.

share|improve this answer
    
Thanks, this worked. Not that it matters, but is there any particular reason for not using two dirname-s or /../..? –  user1335014 May 21 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 at 16:28
    
I think that $(dirname $(readlink -f $(which math)))/../SystemFiles/Links/MathLink/DeveloperKit/Linux-x86-64/CompilerAddition‌​s 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/CompilerAdditi‌​ons. 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 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 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 at 19:00

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.