J'essaie d'utiliser ccall pour appeler des fonctions à partir d'une bibliothèque partagée que j'ai créée. Actuellement, lorsque je tente de lancer ccall, je reçois une erreur:Julia ccall: impossible de trouver la fonction dans la bibliothèque
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
Cependant, quand je considère le contenu de libbar.so, la fonction est indiquée:
... 000000000000057c T add (flotteur, flotteur) ...
Voici ma configuration:
// 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;
}
Voici comment je le compiler:
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
Voici mon script julia:
println("Running Test Function")
shouldBeThree = ccall((:add, "libbar"), Float32, (Float32, Float32), 1.0, 2.0)
println("Should be Three: ", shouldBeThree)
Je pense qu'il est étrange que nm liste la fonction avec des arguments. Cela n'indique-t-il pas que le nom est tronqué et que le '' extern '' C "' 'n'est pas en train de se déclencher? – ivarne
Hmmm. Si je regarde bar.o la fonction semble être mutilée. Cela signifie que je dois réparer comment je le compile? – Mageek
Ensuite, vous devez donner à Julia le nom brouillé, ou comprendre ce qui se passe. Avez-vous besoin du mot-clé '' extern'' sur la même ligne que le prototype de la fonction? Je ne suis pas un gourou, mais je n'ai jamais vu une fonction déclarée externe de cette façon auparavant. – ivarne