Merci Michael,
quelques points complémentaires concernant la compilation sous Windows.
En effet si l'export des symboles dans la bibliothèque dynamique est automatique quand on compile avec GCC* sous Linux (et macOS dans ton cas), cela ne semble pas être le cas avec les différents compilateurs à ma disposition sous Windows :
- gcc 4.6.3 (mingw) -> le DLL produit est 32bit, ne contient pas de symboles exportés.
- gcc 5.3.0 (mingw) -> le DLL produit est 32bit, ne contient pas de symboles exportés.
- gcc 6.3.0 (mingw-64) -> le DLL produit ne contient pas de symboles exportés.
- gcc 4.9.3 (cygwin-64) -> le DLL produit ne contient pas de symboles exportés et dépend de cygwin1.dll.
- Visual Studio 2015 -> Le DLL produit contient la définition de la fonction display() (voir ci-dessous) et dépend de vcruntime140.dll et uctrbased.dll.
- pour exporter la fonction display() il faut mettre dans le fichier helloworld.h la ligne suivante au lieu de ce qui est écrit dans ton article :
__declspec(dllimport) void display(char* ch);
Impossible d'exporter printf() de cette façon et j'ai pas creusé donc il faudra soit définir une nouvelle fonction C qui l'invoque, soit commenter les lignes équivalentes coté Java. - Note: pour une compilation 64bit,
- Dans Project->Properties changer la Platform en x64
- Dans Project->Properties->General changer Configuration Type en Dynamic Library (DLL)
- Dans Dans Project->Properties->Linker->Advanced changer Target Machine en Machine x64 (/MACHINE:X64) (si ce n'est pas déjà fait)
Du coup, j'ai pu lancer le prog en utilisant le DLL généré par VC 2015 (après avoir commenté tout ce qui est en rapport avec
printf() dans le code Java)
*Vérifiable en faisant :
readelf -Ws helloworld.so
0 |
0 |