Я пытаюсь скомпилировать следующий код 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'
Что я делаю неправильно?
пример вы пытаетесь скомпилировать немного устарели. Как уже упоминалось, вам нужно дать 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 🙂
Повеселись.
Других решений пока нет …