Julia ccall:在库中找不到功能

时间:2014-04-30 21:09:05

标签: c julia shared-libraries

我正在尝试使用ccall从我创建的共享库中调用函数。 目前,当我尝试运行ccall时,出现错误:

ERROR: ccall: could not find function add in library libbar
 in anonymous at no file
 in include at boot.jl:244
 in include_from_node1 at loading.jl:128
 in process_options at client.jl:282
 in _start at client.jl:351
while loading /somedir/juliatest.jl, in expression starting on line 2

但是,当我查看libbar.so的内容时,列出了该函数:

... 000000000000057c T add(float,float) ...

这是我的设置:

// bar.hpp
#ifndef __cplusplus
extern "C" {
#endif

extern float add(float a, float b);

#ifndef __cplusplus
}
#endif

// bar.cpp
#include "bar.hpp"
float add(float a, float b)
{
return a+b;
}

以下是我编译它的方法:

g++ -Wall -fPIC -c bar.cpp
gcc -shared -o libbar.so -Wl,-soname,libbar.so.1 -o libbar.so.1.0 bar.o
sudo mv libbar.so.1.0 /opt/lib
sudo ln -sf /opt/lib/libbar.so.1.0 /opt/lib/libbar.so.1
sudo ln -sf /opt/lib/libbar.so.1.0 /opt/lib/libbar.so

这是我的朱莉娅剧本:

println("Running Test Function")
shouldBeThree = ccall( (:add, "libbar"), Float32, (Float32, Float32), 1.0, 2.0)
println("Should be Three: ", shouldBeThree)

2 个答案:

答案 0 :(得分:3)

您正在使用g++进行编译。因此,__cplusplus已定义,预处理器会排除您的extern "C"

答案 1 :(得分:1)

问题是您在头文件中使用#ifndef而不是#ifdef

// bar.hpp
#ifdef __cplusplus
extern "C" {
#endif

float add(float a, float b);

#ifdef __cplusplus
}
#endif

通过该更改,文件应该使用C和C ++编译器进行编译。