如何在 C++ 中使用 julia 语言 (visual studio)

how to use the julia language in c++ (visual studio)

是否可以在c++中使用julia语言? julia 语言是否提供了一些库来包含?

目前,我正在尝试在我的 c++ 项目中使用 julia 语言的一些功能。 这可能吗?我能做什么?

提前致谢。

嵌入 Julia

是的,Julia 可以嵌入到 Julia 本身可用的所有平台上的 C 或 C++ 程序中,在所有情况下,一般方法都是相同的,但特别是嵌入 Windows更难,因为目前 compilation/embedding (gcc) 的框架不是该平台 (MSVC) 的默认框架。原因是 Julia 是基于 Windows 使用 gcc 而不是 MSVC.

高水平

在较高层次上,嵌入 Julia 的步骤包括使用 Julia 发行版提供的资源进行编译(见下文),然后初始化程序以启动 Julia 引擎。

包括julia.h

c 或 c++ 程序的所有必要定义都位于 julia.h 中。它的确切位置因每个发行版而异,但通常位于 julia-basedir/include 中。

link 到 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

in the docs所述,使用jl_init启动Julia运行时,同时可选择指定Julia编译基础支持的目录sys.ji可以定位。我发现最好直接指定它而不是让它默认; julia-config.jl还提供了-DJL_INIT_DIR可以盲目作为jl_init的参数;文档提供了详细信息。

Windows

的问题

返回Windows。如果您按照 compiling Julia in Windows, you will end up with an MSYS2 compilation environment. Note that these instructions are somewhat out of date, and MSYS2 has advanced since then, so it is now simpler (for example use of 7-zip is not necessary). As an aside, this also allows you to obtain git directly 的说明进行操作 - 请注意,@ntzrmtthihu777 的最后评论现在是最好的评论,因为 git 通过优于 git-bash 的 MSYS2,它基于较旧的 MSYS

gcc

现在 MSYS2 确实提供了一个 gcc,但你不能使用它,因为它隐含地使用了线程模型 (POSIX) 与 Julia (Winthreads) 使用的不同,您必须从 mingw-builds 获取 gcc,这使您可以在安装期间选择模型; Julia 编译 Window 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 的程序,并且将是一个 .exe,即使在 MSYS2 之外调用时也能正常工作,这很好。

但是如果您希望直接使用 MSVC,那么我应该警告您使用 MSVC 编译 Julia 仍然是早期阶段,所以用 MSVC 代替 gcc 的上述方法目前不会工作,但有可能 libjulia 可以 linked 到;预计至少 libraries created by mingw are usable by MSVC

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

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

创建julialib.lib

  1. 使用dumpbin将符号从dll导出到一个文件例如:

    dumpbin /exports libjulia.dll > output

  2. 将输出转换为 .def 文件,方法是删除多余的文本并将 EXPORTS 放在顶部详细描述的时间 here

  3. 使用 lib 从 .def.

    创建一个 .lib

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

  4. 将libjulia.lib放在与libjulia.dll

  5. 相同的目录下
  6. 通过将 julia.h 和 link 包含到 libjulia.lib
  7. 来构建项目

waTeim 的回答是正确的,去投票吧!我只想通过在您的 Visual Studio 项目中使用该库的步骤来补充它。以下假设 libjulia.lib 在您的 Julia 的 bin 子文件夹中,并且您需要一个 64 位应用程序。我是在 Visual Studio 2013 年做的。

首先设置 64 位解决方案/项目(如果尚未设置)。 Select/点击/检查以下内容:

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

然后设置项目的配置:

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

确保您的活动配置适用于平台 x64,然后构建您的解决方案。它对我有用,希望对你也有用:)