Hello again,
I am writing to this post, as I face some more problems with trying to link
Julia functions with C++ code.
The thing is that I changed my current Julia version, I installed Julia
running the source code as I wanted
to install the Cxx package as well.
So, I just went to run the first smallest example with some c code and c++
code that uses a julia function
as presented here <http://julia.readthedocs.org/en/latest/manual/embedding/>,
so I only try to run the following file:
#include <julia.h>
int main(int argc, char *argv[]){
/* required: setup the julia context */
jl_init(NULL);
/* run julia commands */
jl_eval_string("print(sqrt(2.0))");
/* strongly recommended: notify julia that the program is about to
terminate. this allows julia time to cleanup pending write requests
and run all finalizers */
jl_atexit_hook();
return 0;}
The first thing that was different was that when I was including just the
path of julia.h and libjulia.so and I
run the command like this:
gcc -o test main.c -I /home/kostav/julia/src -L/home/kostav/julia/usr/lib
-ljulia
I receive an error saying:
*In file included from main.c:1:0: /home/kostav/julia/src/julia.h:12:24:
fatal error: libsupport.h: No such file or directory #include
"libsupport.h" compilation terminated.*
Then when I add the path of libsupport.h I receive a similar error msg
saying that uv.h is missing so I have
to add its path as well, and as a result I finally run the following
command:
gcc -o test main.c -I /home/kostav/julia/src -I
/home/kostav/julia/usr/include -I /home/kostav/julia/src/support
-L/home/kostav/julia/usr/lib -ljulia
In that case I receive various errors about undefined references regarding
llvm functions and as a result I include
as well the equivelant library and finally run the following command:
gcc -o test main.c -I /home/kostav/julia/src -I
/home/kostav/julia/usr/include -I /home/kostav/julia/src/support
-L/home/kostav/julia/usr/lib -ljulia -lLLVM-3.7svn
On this case the program does compile but when I try to run it, I receive
the following error:
*error while loading shared libraries: libjulia.so: cannot open shared
object file: No such file or directory*The exact same implies for the
equivalent program in c++. Note that when I try to call a julia function
inside a c++ more complicated
structure (namely in a class) I receive a different error. More
specifically just for the very simple class that exists
in this Cxx example
<https://github.com/Keno/Cxx.jl#example-8-using-c-with-shared-libraries>
for just using the same simple julia function inside the class that leads
to the following slighltly different cpp file
#include "ArrayMaker.h"
#include <iostream>
using namespace std;
ArrayMaker::ArrayMaker(int iNum, float fNum) {
jl_init(NULL);
jl_eval_string("print(sqrt(2.0))");
cout << "Got arguments: " << iNum << ", and " << fNum << endl;
iNumber = iNum;
fNumber = fNum;
fArr = new float[iNumber];
jl_atexit_hook();
}
float* ArrayMaker::fillArr() {
cout << "Filling the array" << endl;
for (int i=0; i < iNumber; i++) {
fArr[i] = fNumber;
fNumber *= 2;
}
return fArr;
}
With the header file being almost the same:
#ifndef ARRAYMAKER_H
#define ARRAYMAKER_H
#include <julia.h>
class ArrayMaker
{
private:
int iNumber;
float fNumber;
float* fArr;
public:
ArrayMaker(int, float);
float* fillArr();
};
#endif
When I try to compile in terminal using the following command:
g++ -o test ArrayMaker.cpp -I /home/kostav/julia/src -I
/home/kostav/julia/usr/include -I /home/kostav/julia/src/support
-L/home/kostav/julia/usr/lib -ljulia -lLLVM-3.7svn
I do receive the following error:
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crt1.o: In
function `_start':
/build/buildd/glibc-2.21/csu/../sysdeps/x86_64/start.S:114: undefined
reference to `main'
collect2: error: ld returned 1 exit status
I am really not sure how to resolve any of the two errors and in general
the second one is also pretty important to me, as in general my end goal
is starting from a julia file to use my self-written c++ code, where inside
the c++ code I call some other self-written julia functions, I know it does
sound kind twisted, but that's what I am interested to do, as I am trying
to tackle a big Mathematical Problem by builing the original problem in Jump
then decompose it and use a solver that is written in c++ (that's why I
need to call c++ inside julia) which then needs again to send back
information
to the original model and probably solve some subproblems with CPLEX
(that's why I will need inside the c++ code to call julia functions again).
That
with as much as few words as possible in order not to bother you with a lot
of unnecessary information.