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);


    /* send 42+137 using the full form Plus[42, 137] */
    MLPutFunction(link, "Plus", 2);
    MLPutInteger(link, 42);
    MLPutInteger(link, 137);

    /* get packets until we find a ReturnPacket or error */
    while ((packet = MLNextPacket(link)) && packet != RETURNPKT)

    if (MLError(link))
    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
CADDSDIR = ${MLINKDIR}/${SYS}/CompilerAdditions


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 $@

    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?


1 Answer 1


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


You can use this merthod of detecting the location in a shell script that will start your program.

  • $\begingroup$ Thanks, this worked. Not that it matters, but is there any particular reason for not using two dirname-s or /../..? $\endgroup$ Commented May 21, 2014 at 16:23
  • $\begingroup$ @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. $\endgroup$
    – Szabolcs
    Commented May 21, 2014 at 16:28
  • $\begingroup$ 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. $\endgroup$ Commented May 21, 2014 at 16:44
  • $\begingroup$ @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. $\endgroup$
    – Szabolcs
    Commented May 21, 2014 at 18:58
  • $\begingroup$ @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. $\endgroup$
    – Szabolcs
    Commented May 21, 2014 at 19:00

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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