如何在C++(Visual Studio)中使用Julia语言

7

是否可以在C++中使用Julia语言?Julia语言是否提供了一些可包含的库?

目前,我正在尝试在我的C++项目中使用Julia语言的某些函数。这是可能的吗?我该怎么做?

先行致谢。


你有没有阅读过关于在C/C++中嵌入Julia的手册章节?你尝试过什么? - mbauman
@MattB。是的,我已经阅读了它。但是,我正在使用Visual Studio 2013在Windows10系统下。我不知道如何在我的计算机上使用GCC... - Yves
@MattB。首先,我下载了julia-0.3.6。然后我将路径:/julia-0.3.6/include添加到我的项目的“包含目录”中。在我看来应该有一些库,但我找不到它们。所以显然,我会得到LNK错误。在julia-0.3.6中,有一个名为lib的文件,但只有一个名为sys.ji的文件。所以我现在不知道该怎么办。你能帮我吗? - Yves
我对嵌入式和MSVC都不熟悉,所以恐怕我无法直接帮助您。但是,通过编辑您的问题并更具体地分解问题,您肯定会有更好的机会得到良好的回应。例如,“如何在MSVC中与libjulia链接?”发布您正在尝试编译的来自Julia的简单hello-world程序的源代码,并显示错误消息。 有关详细信息,请参见此Stackoverflow页面:http://stackoverflow.com/help/how-to-ask - mbauman
2个回答

12

嵌入 Julia

是的,Julia可以被嵌入到C或C++程序中,在所有支持Julia本身的平台上都可以这样做,而且通常的方法是相同的。但是特别需要注意的是,在Windows平台上的嵌入比较困难,因为目前编译/嵌入框架(gcc)不是该平台的默认熟悉框架(MSVC)。原因是Julia在Windows上使用的是gcc而不是MSVC。

高级

从高层次来看,嵌入Julia的步骤包括使用Julia分发的资源进行编译(参见下文),然后初始化程序以启动Julia引擎。

包含 julia.h

无论是c还是c++程序所需的所有定义都位于中。它的确切位置因每个发布版而异,但通常位于/include中。

链接到 libjulia

同样,嵌入Julia所需的所有符号都位于libjulia中。 在OS / X和Linux上,libjulia.so通常位于julia-basedir / julia / lib中,而在Windows上,libjulia.dll位于julia-basedir / julia / bin中。
或者在0.4版本中可以选择使用julia-config.jl
前面的内容可能听起来令人困惑,但幸运的是,在最新的Julia 0.4发行版中包含了一个名为julia-config.jl的脚本,它将自动提供所有所需的编译器标志 - 免责声明:我编写了它。在这种情况下,您需要做的就是剪切和粘贴,并按照文档中的模式创建一个Makefile,make将处理其余部分。
使用jl_init进行初始化
根据文档所述,使用jl_init来启动Julia运行时,可选择指定Julia编译的基础支持sys.ji所在的目录。最好直接指定该目录,而不是使用默认值。此外,julia-config.jl还提供了-DJL_INIT_DIR,可作为jl_init的参数。文档提供了详细信息。

Windows的问题

如果您按照在Windows中编译Julia的说明操作,您将得到一个MSYS2编译环境。请注意,这些说明有些过时,MSYS2已经更新,因此现在更简单(例如不需要使用7-zip)。另外,这也允许您直接获取git -- 请注意@ntzrmtthihu777的最后一条评论现在是最好的,因为通过MSYS2获取git优于基于旧版MSYS的git-bash。

gcc

现在,MSYS2确实提供了一个gcc,但是你不能使用它,因为它隐式地使用了一个与Julia(Winthreads)不同的线程模型(POSIX),而你必须从mingw-builds获取gcc,在安装过程中可以选择模型;这也在Julia编译窗口的README中指出,但需要重申。其他工具可以从MSYS2软件包管理器pacman中获得。
Mingw builds提供了一个安装程序,我发现以下fstab足以使mingw-builds gcc在正确的位置可用:
none / cygdrive binary,posix=0,noacl,user 0 0

c:/mingw-w64/x86_64-4.9.2-win32-seh-rt_v3-rev1/mingw64 /mingw64 ntfs binary,noacl,auto 0 0

展望未来

如果您成功创建了一个适合从源代码编译Julia的编译环境,可以通过实际编译Julia进行验证,那么上面的指令包括julia-config.jl/Makefile简化将起作用,并且将生成一个内嵌Julia的程序,即使在MSYS2外部调用也能正常工作,这很好。

但是,如果您想直接使用MSVC,那么我应该警告您,使用MSVC编译Julia仍处于早期阶段,因此上述使用gcc替换为MSVC的方法目前不起作用,但有可能链接到libjulia;至少预计由mingw创建的库可被MSVC使用

更新的MSVC编译(创建julialib.lib)

libjulia.dll是包含所有嵌入Julia所需符号的库,虽然它由gcc创建,但由于所有这些符号都具有C命名,而不是C++名称修饰,因此可以被MSVC使用。但是,它不能直接使用,需要创建一个.lib文件。可以按照以下方式完成。

创建julialib.lib

  1. 使用dumpbin从dll中导出符号到文件中,例如:

    dumpbin /exports libjulia.dll > output

  2. 将输出转换为.def文件,删除多余的文本,并在顶部放置EXPORTS,详见此处

  3. 使用lib从.def创建.lib

    lib /def:libjulia.def /out:libjulia.lib /machine:x64

  4. 将libjulia.lib放置在与libjulia.dll相同的目录中。

  5. 通过包含julia.h并链接到libjulia.lib来构建项目。

我按照你的最后(1-5)步骤,并出现了以下错误:LNK2019 错误:在函数 _main 中引用的未解析外部符号 __imp__jl_eval_string。 - Nicole
@Nicole,我曾经也为各种链接器选项犯过错误。您可以确认已设置正确的库目录,链接器实际上正在找到libjulia.lib,以及您是否在64位下编译? 我相信这最终会成功的。 - waTeim
我实际上包括了以下四个步骤:
  1. 把C:\Julia-0.3.9\include加入到VC++ Inc Dir中;
  2. 把VC++的Lib Dir设置为C:\Julia-0.3.9\bin;
  3. 把C/C++-->Additional Inc Dir设为:C:\Julia-0.3.9;C:\Julia-0.3.9\bin;C:\Julia-0.3.9\include\julia;
  4. 把Linker-->Input--->Additional Dep设为libjulia.lib。
同时,我已经在bin文件夹中创建了libjulia.lib,并没有将其复制到其他位置。那么你认为我的问题出在哪里呢?
- Nicole
我也使用 Win 64 进行了编译。 - Nicole
@Nicole 看起来没问题,可能缺少一些非增量标志。我会尝试使用gist复制和记录。与此同时,您可以在dev上的讨论中找到有用的信息。 - waTeim
@Nicole 你可能会发现 这个脚本 很有用(脚本名称和位置已更改)。 - waTeim

3

waTeim的回答是正确的,请投票支持!我只想加强一下,在你的Visual Studio项目中使用该库的步骤。以下假设libjulia.lib在Julia的bin子文件夹中,并且您需要一个64位应用程序。我在Visual Studio 2013中完成。

首先,如果还没有设置64位解决方案/项目,请选择/单击/检查以下内容:

  1. 构建/配置管理器
  2. 活动解决方案平台/新建
  3. X64/从Win32复制设置/创建新项目平台

然后设置项目的配置:

  1. 右键单击项目/属性
  2. 选择配置=所有配置,平台=x64
  3. 调试/环境:PATH=$(JULIA_HOME);$(PATH)
  4. C/C++/常规/其他包含目录:$(JULIA_HOME)\..\include\julia
  5. 链接器/常规/其他库目录:$(JULIA_HOME)
  6. 链接器/输入/其他依赖项:将libjulia.lib添加到列表中

确保您的活动配置是平台x64,然后构建解决方案。在我的情况下,它起作用了,希望它对您也有用 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接