Компиляция Джулии, встроенной в код C ++

Я пытаюсь скомпилировать следующий код C ++

#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;
}

Я компилирую код используя

gcc -I/usr/include/julia -L/usr/lib/x86_64-linux-gnu/julia -ljulia juliatest.cpp -o test

Я получаю следующую ошибку:

juliatest.cpp:19:20:: error: too few arguments to function ‘void jl_atexit_hook(int)’
jl_atexit_hook();
^
In file included from juliatest.cpp:1:0:
/usr/include/julia/julia.h:1188:16: note: declared here
DLLEXPORT void jl_atexit_hook(int status);
^

Если я удалю jl_atexit_hook(); из кода я получаю следующие ошибки:

juliatest.cpp:(.text+0x1a): undefined reference to `jl_init_with_image'
juliatest.cpp:(.text+0x24): undefined reference to `jl_eval_string'

Что я делаю неправильно?

0

Решение

пример вы пытаетесь скомпилировать немного устарели. Как уже упоминалось, вам нужно дать exitcode к jl_atexit_hook()
функция. Сообщение компоновщика о пропущенных функциях, определенных в библиотеках. Чтобы избавиться от деталей дистрибутива, я скачал и собрал тарболом. Теперь пример может быть собран с использованием этого make-файла:

JULIA_DIR:=julia-0.4.2
JULIA_LIB:=$(JULIA_DIR)/usr/lib
JULIA_SRC:=$(JULIA_DIR)/src
JULIA_INC:=$(JULIA_DIR)/usr/include
CPPFLAGS:=-I$(JULIA_INC) -I$(JULIA_SRC) -I$(JULIA_SRC)/support
LDFLAGS:=-L$(JULIA_LIB)
LDLIBS=-ljulia
export LD_LIBRARY_PATH:=$(JULIA_LIB):$(JULIA_LIB)/julia

all: main

run: main
@./main

clean:
rm -f main

Если вы сейчас печатаете make run вы получите следующее сообщение об ошибке о неверном пути, по которому ищется образ системы. Как заметил Томас Вот функция jl_init () создает контекст, который в этом случае может потерпеть неудачу. Мы дадим имя и путь к образу системы для функции init, используя jl_init_with_image("julia-0.4.2/usr/lib/julia", "sys.so") вместо. Это ужасно жестко закодированный путь, который, несомненно, можно заменить. Но для начала работы с этим примером и для ознакомления с этой проблемой достаточно. Исправленный пример таков:

#include <julia.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
/* required: setup the julia context */
jl_init_with_image("julia-0.4.2/usr/lib/julia", "sys.so");

/* 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(0);
putchar('\n');
return 0;
}

Бег make run Теперь будет довольно сложный способ вычисления квадратного корня из 2 🙂

Повеселись.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]