编译嵌入C++代码中的Julia

Compiling Julia embedded in C++ code

本文关键字:Julia 代码 C++ 编译      更新时间:2023-10-16

我正在尝试编译以下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'

我做错了什么?

您试图编译的示例有点过时了。如前所述,您需要给jl_atexit_hook()一个exitcode作用链接器消息是关于库中定义的缺少函数的消息。为了去掉分发细节,我下载并构建了tarball。现在可以使用以下makefile构建示例:

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,你会得到下一条关于搜索系统映像的错误路径的错误消息。正如Thomas在这里指出的,函数jl_init()正在创建一个上下文,在这种情况下可能会失败。我们将使用jl_init_with_image("julia-0.4.2/usr/lib/julia", "sys.so")为init函数提供系统映像的名称和路径。这是一条丑陋的硬编码路径,肯定可以被取代。但对于开始这个例子并了解这个问题来说,这就足够了。纠正后的例子是:

#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:-)平方根的一种相当复杂的方法

玩得开心。