2014-04-30 1 views
2

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) 
+0

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

+0

Hmmm. Si je regarde bar.o la fonction semble être mutilée. Cela signifie que je dois réparer comment je le compile? – Mageek

+0

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

Répondre

3

Vous compilez avec g++. Par conséquent, __cplusplus est défini et votre extern "C" est exclu par le préprocesseur.

1

Le problème est que vous utilisez #ifndef au lieu de #ifdef dans le fichier d'en-tête.

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

float add(float a, float b); 

#ifdef __cplusplus 
} 
#endif 

Avec ce changement le fichier devrait compiler avec les deux compilateurs C et C++.

Questions connexes