【问题标题】:embedding Julia in C/C++ on OSX在 OSX 上将 Julia 嵌入到 C/C++ 中
【发布时间】:2019-01-25 08:45:20
【问题描述】:

我正在尝试编译一个非常简单的 C/C++ 程序来调用 Julia 函数。按照您在 Julia 文档页面上找到的说明,我将链接路径设置为 /Users/william.calhoun/Desktop/romeo/lib/julia 以查找 libjulia.so,并将包含路径设置为 /Users/william.calhoun/Desktop/romeo/include/julia 以查找 julia.h

我有一个名为 test.c 的 C 文件,它运行以下代码:

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


int main(int argc, const char * argv[]) {

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

但是这会产生以下错误:

Undefined symbols for architecture x86_64:
    "_jl_atexit_hook", referenced from:
        _main in test.o
    "_jl_eval_string", referenced from:
        _main in test.o
    "_jl_init", referenced from:
        _main in test.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

除了调用 Julia 源代码中正确定义的函数(希望如此)之外,我没有做任何事情。我究竟做错了什么?这似乎是最简单的例子,我想不通。

任何帮助将不胜感激!

【问题讨论】:

  • 您需要明确链接到 Julia 库。您是这样做还是只是将链接器指向它的存储目录?
  • C 不是 C++ 不是 C。请选择正确的语言(我认为是 C)。
  • 请不要在多个论坛中交叉发帖 (github.com/JuliaLang/julia/issues/12673)。在这两个地方回答问题的是同一个人。
  • 我已经明确链接到 libjulia.dylib 并且正在使用 C(我只是引用了两者,因为你可以在两者中做同样的事情)。现在我得到 dyld: Library not loaded: @rpath/libjulia-debug.dylib Reason: Image not found 的错误

标签: c julia


【解决方案1】:

链接到 libjulia(OS/X 上的 libjulia.dynlib)

此错误是未链接到 libjulia 的结果,因为所有符号(_jl_atexit_hook_jl_eval_string_jl_init)都位于那个图书馆。概括地说,对于以下所有 3 个平台(Windows、OS/X、Linux),方法是相似的,尽管 libjulia 库在 Windows 上的位置与其他 2 个this stackoverflow question 的位置不同。同样为了完全准确,在 OS/X 上,动态库的扩展名为 .dynlib,而不是像在 Linux 上那样的 .so

链接步骤

为简单起见,假设您已编译为目标代码(有一个名为 embed.o 的文件),这里是链接步骤。

cc -o embed embed.o -L/Users/william.calhoun/Desktop/romeo/lib/julia -Wl,-rpath,/Users/william.calhoun/Desktop/romeo/lib/julia -ljulia

这里有两件重要的事情需要注意。

  1. 使用 -ljulia 进行链接将允许链接器解析上述所有符号。
  2. 由于这是一个动态库并且该动态库位于非标准位置(例如,不在 /usr/lib 中),动态链接器将无法在运行时找到它,除非您在如何找到它。 -rpath 指令使链接器将路径 /Users/william.calhoun/Desktop/romeo/lib/julia 插入到要搜索的路径列表中。

【讨论】:

  • 感谢您的回复。确切地说,我已经链接了 libjulia.dylib。使用 gcc 编译器和 XCode,我不断收到相同的错误。 gcc main.c -L/Users/william.calhoun/Desktop/romeo_juliet/lib/julia -Wl,-rpath,/Users/william.calhoun/Desktop/romeo_juliet/lib/julia -ljulia -I/Users/william.calhoun /desktop/romeo_juliet/include/julia 体系结构 x86_64 的未定义符号:“_jl_atexit_hook”,引用自:main-1ea2de.o ld 中的 _main:未找到体系结构 x86_64 的符号 clang:错误:链接器命令失败,退出代码为 1 (使用 -v 查看调用)
  • 好的!因此,我按照您的说明进行了编译。除了我必须切换 gcc main.c ..... 并包含 -I 包含路径 但是现在输出(a.out 文件)对我产生以下错误 ./a.out William's MacBook Air:skeleton william .calhoun$ ./a.out -o 系统映像文件“/Users/william.calhoun/Documents/skeleton/skeleton/../lib/julia/sys.ji”未找到/Users/william.calhoun/Documents/骨架/骨架/ 是我的 main.c 和 a.out 所在的位置。再次感谢您的帮助!
  • 好的,我能够修复错误。但是,如果能帮助我在终端中的 Xcode 与编译器之类的 IDE 中编译它,我们将不胜感激!
  • 哦,Xcode 嗯,好主意。这绝对是可能的,尽管我以前没有这样做过。我会这样做并更新答案。这需要一点时间,因为最终目标是在框架中创建 libjulia。作为一个简单的实验,同时您可以尝试通过简单地将这些标志添加到 Xcode 项目中的编译器和链接器标志为应用程序目标,同时添加库。这将导致应用程序只能在您的机器上运行,虽然不是很有用,但很好的做法。
猜你喜欢
  • 2016-06-29
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
相关资源
最近更新 更多