[julia-users] Errors while trying to use cxx and embed Julia together
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); coutendlTest = 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) @echoSimplecompilernamedmycchasbeen 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
Re: [julia-users] Errors while trying to use cxx and embed Julia together
There's theoretically nothing wrong with this, but you do need to setup the include paths for Cxx. There's addHeaderDir for this purpose. On Tue, Jul 14, 2015 at 12:38 PM, Kostas Tavlaridis-Gyparakis kostas.tavlari...@gmail.com wrote: 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); coutendlTest = 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) @echoSimplecompilernamedmycchasbeen 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