我正在尝试使用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)
答案 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 ++编译器进行编译。