Hello again, I am running Julia Version 0.4.0-dev+5841 (installed from source code) and currently run Ubuntu 15.04. I am trying to write a julia file that will call some c++ classes and functions, where inside these functions some other Julia functions will be used and I face some errors. Let me get things one by one.
This is my c++ files: 1) The cpp of the class (ArrayMaker.cpp): #include "ArrayMaker.h" #include <iostream> using namespace std; ArrayMaker::ArrayMaker() { // TODO Auto-generated constructor stub } ArrayMaker::~ArrayMaker() { // TODO Auto-generated destructor stub } double ArrayMaker::ArrayMak(int iNum, float fNum) { jl_init_with_image("/home/kostav/julia/usr/lib/julia", "sys.so"); jl_eval_string("print(sqrt(2.0))"); cout << "Got arguments: " << iNum << ", and " << fNum << endl; double sol; jl_load("/home/kostav/.julia/v0.4/loleee/src/loleee.jl"); jl_value_t * mod = (jl_value_t*)jl_eval_string("loleee"); jl_function_t * func = jl_get_function((jl_module_t*)mod,"funior"); jl_value_t * argument = jl_box_float64(2.0); jl_value_t * argument2 = jl_box_float64(3.0); jl_value_t * ret = jl_call2(func, argument, argument2); sol = jl_unbox_float64(ret); iNumber = iNum; fNumber = fNum; fArr = new float[iNumber]; jl_atexit_hook(); return sol; } float* ArrayMaker::fillArr() { cout << "Filling the array" << endl; for (int i=0; i < iNumber; i++) { fArr[i] = fNumber; fNumber *= 2; } return fArr; } 2) The equivelant header file (ArrayMaker.h): #ifndef ARRAYMAKER_H #define ARRAYMAKER_H #include <julia.h> class ArrayMaker { public: ArrayMaker(); virtual ~ArrayMaker(); double ArrayMak(int, float); float* fillArr(); private: int iNumber; float fNumber; float* fArr; }; #endif 3) The main file (main.cpp): #include "ArrayMaker.h" #include <iostream> using namespace std; int main(int argc, char ** argv) { ArrayMaker* FI_CSP=new ArrayMaker(); int a = 7; float b = 4; double z; z = FI_CSP->ArrayMak(a,b); cout<<endl<<"Test = "<< z; return 1; } Now inside the function ArrayMak I call a julia function that just takes two arguements and adds them and returns the value of the sum this function is called by a module I made under the name lolee. Note that when I compile and run this code with the equivelant makefile it works properly. Now next thing I do is to create the shared library that I need to pass to the cxx, just so that you can have a look in every single line I write this is the makefile I use to create the shared library: # define the C compiler to use CC = g++ # define any compile-time flags CFLAGS = -fPIC -Wall -g -Wl,-rpath,/home/kostav/julia/usr/lib LDFLAGS = -shared # define any directories containing header files other than /usr/include # INCLUDES = -I /home/kostav/julia/src -I /home/kostav/julia/usr/include -I /home/kostav/julia/src/support -I /home/kostav/julia/contrib # define library paths in addition to /usr/lib # if I wanted to include libraries not in /usr/lib I'd specify # their path using -Lpath, something like: LFLAGS = -L/home/kostav/julia/usr/lib # define any libraries to link into executable: # if I want to link in libraries (libx.so or libx.a) I use the -llibname # option, something like (this will link in libmylib.so and libm.so: LIBS = -ljulia -lLLVM-3.7svn # define the C source files SRCS = main.cpp ArrayMaker.cpp # define the C object files # # This uses Suffix Replacement within a macro: # $(name:string1=string2) # For each word in 'name' replace 'string1' with 'string2' # Below we are replacing the suffix .c of all words in the macro SRCS # with the .o suffix # OBJS = $(SRCS:.c=.o) # define the shared library MAIN = test.so # # The following part of the makefile is generic; it can be used to # build any executable just by changing the definitions above and by # deleting dependencies appended to the file from 'make depend' # .PHONY: depend clean all: $(MAIN) @echo Simple compiler named mycc has been compiled $(MAIN): $(OBJS) $(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS) $(LFLAGS) $(LIBS) $(LDFLAGS) # this is a suffix replacement rule for building .o's from .c's # it uses automatic variables $<: the name of the prerequisite of # the rule(a .c file) and $@: the name of the target of the rule (a .o file) # (see the gnu make manual section about automatic variables) .c.o: $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ clean: $(RM) *.o *~ $(MAIN) depend: $(SRCS) makedepend $(INCLUDES) $^ # DO NOT DELETE THIS LINE -- make depend needs it So after that I end up with the shared library test.so. Then I write the following julia file where I try to do a call of the c++ class that has inside the call to the julia function to check that it works with the following julia file: using Cxx # Importing shared library and header file const path_to_lib = "/home/kostav/Documents/Project/julia/cle" #const path2 = "/home/kostav/julia/src/julia.h" #pwd() addHeaderDir(path_to_lib, kind=C_System) Libdl.dlopen(path_to_lib * "/test.so", Libdl.RTLD_GLOBAL) #include("/home/kostav/julia/src/julia.h") cxxinclude("ArrayMaker.h") maker = @cxxnew ArrayMaker() a = @cxx maker->ArrayMak(5, 2.0) So when I run this file in julia I receive the following outcome: In file included from :1: /home/kostav/Documents/Project/julia/cle/ArrayMaker.h:4:10: fatal error: 'julia.h' file not found #include <julia.h> ^ 1.4142135623730951Got arguments: 5, and 2 And actually when julia crushes when it reaches to the point to run the command: " jl_value_t * ret = jl_call2(func, argument, argument2);" Actually is doesn't crush, what I get in the terminal is just the cursos moving as if a process is loading, but it does it for 10 minutes now, so I assume sth is going wrong. Any ideas what I should do different? In general you think is valid what I am trying to do (use cxx to call self-written c++ classes where inside I call self-written julia functions)? In general I do this kind of functionality a lot and that's why I am asking. I am really not sure what to do on this point. Any kind of help would be grateful.