我正在尝试编译一个非常简单的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源代码中正确(希望)定义的函数外,我没有做任何其他事情。我究竟做错了什么?这似乎是最简单的示例,我无法弄清楚。

任何帮助将非常感激!

最佳答案

链接到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上的扩展名。

链接步骤

为简单起见,假设您已编译为目标代码(有一个名为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


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


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

关于c - 在OSX上将Julia嵌入C/C++中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32060843/

10-11 16:33