Forum de la communauté SFML

Bindings - autres langages => DotNet => Discussion démarrée par: HugoLescargot le Juin 02, 2013, 03:07:05 pm

Titre: Linux + MonoDevelop : System.DllNotFoundException: csfml-window-2
Posté par: HugoLescargot le Juin 02, 2013, 03:07:05 pm
Bonjour,

Suite à plusieurs tests infructueux, je me permet de poster sur un sujet déjà abordé, l'erreur System.DllNotFoundException: csfml-window-2 qui survient au moment de l’exécution. Dans mon cas il s'agit de l'exemple Window.cs.

J'ai fait les manipulations sous Windows 7, l'exemple se lance sans problème. ce n'est pas le cas sous Linux. Tout porte à croire que le problème est le lien vers les librairies qui ne se fait pas correctement.

Mon environnement :
-LinuxMint Mate 15 32 bits
-Mono Mono 2.10.8.1, installé via le gestionnaire de paquets
-MonoDevelop 3.0.3.2, installé via le gestionnaire de paquets

Les manipulations effectuées :
-téléchargement de http://www.sfml-dev.org/download/sfml.net/SFML.Net-2.0-32bits.zip
-création d'une solution vide dans MonoDevelop
-ajout du fichier Window.cs à la solution
-ajout de la référence sfmlnet-window-2.dll
-téléchargement de http://www.go-mono.com/tao/1.2.0/Tao-1.2.0-2-mono.zip
-ajout de la référence Tao.OpenGl.dll
-ajout de la référence Tao.OpenGl.Glu.dll

à ce stade la construction fonctionne
l'exécution donne l'exception

System.DllNotFoundException: csfml-window-2
  at (wrapper managed-to-native) SFML.Window.Window:sfWindow_createUnicode (SFML.Window.VideoMode,intptr,SFML.Window.Styles,SFML.Window.ContextSettings&)
  at SFML.Window.Window..ctor (VideoMode mode, System.String title, Styles style, ContextSettings settings) [0x00000] in <filename unknown>:0
  at window.Program.Main () [0x00000] in /home/user/Documents/monodevelop/sfml_t1/sfml_t1/Window.cs:16

-téléchargement de http://www.sfml-dev.org/download/csfml/CSFML-2.0-linux-gcc-32bits.tar.bz2
-copie du contenu du répertoire lib dans /usr/lib en tant que root
-création du fichier de configuration csfml-window-2.dll.config dans le fichier contenant l'exécutable

<configuration>
    <dllmap dll="csfml-window-2" target="libcsfml-window.so.2" />
</configuration>

l'exécution donne toujours l'exception...

J'ai alors essayé divers pistes présentes dans le forum fr et en.

-modifications du fichier de config avec csfml-window-2.dll, libcsfml-window.so, libcsfml-window.so.2.0
-essai avec ./libcsfml-window.so.2 en ayant copié les librairies dans le répertoire de l'exécutable
-essai en ayant copié les dll Windows fournis avec SFML.NET
-essai en ayant téléchargé http://www.sfml-dev.org/download/sfml/2.0/SFML-2.0-linux-gcc-32bits.tar.bz2 et copié le répertoire lib dans /usr/lib et répertoire de l'exécutable
-essai en ayant modifié la variable d'environnement LD_LIBRARY_PATH
-essai en copiant les librairies dans /usr/local/lib
-vérification de la présence de libGlew (en version 1.8 sur ma distribution)

Cependant l'exception survient toujours.

A noter que ldconfig -p | grep libcs ne donne aucun résultat, mais mes connaissances ne me permettent pas de savoir si c'est important.
Y a-t-il une autre manipulation pour valider les liens, des droits à affecter sur les librairies...?

Si quelqu'un a une piste ou voit une erreur, un oubli dans les actions effectuées, je suis preneur.

D'avance merci.










Titre: Re : Linux + MonoDevelop : System.DllNotFoundException: csfml-window-2
Posté par: Laurent le Juin 02, 2013, 07:20:52 pm
Là je ne sais pas quoi te dire, le fichier de config suffit normalement. Il y a forcément un truc qui cloche dans ce que tu as fait ou dans ton environnement. Est-ce que le répertoire qui contient CSFML est connu du chargeur de bibliothèques (ld) ? Sinon il faut le reconfigurer pour ajouter le chemin en question, ou alors le mettre dans la variable d'environnement LD_LIBRARY_PATH si tu veux le faire de manière temporaire.
Titre: Re : Linux + MonoDevelop : System.DllNotFoundException: csfml-window-2
Posté par: HugoLescargot le Juin 03, 2013, 08:26:16 pm
Bonsoir,

J'avoue ne pas vraiment comprendre comment vérifier que le répertoire qui contient CSFML est connu du chargeur de bibliothèques...

la commande  ldconfig -v -p | grep libcs

   libcsfml-window.so.2 (libc6) => /usr/local/lib/libcsfml-window.so.2
   libcsfml-window.so.2 (libc6) => /usr/lib/libcsfml-window.so.2
   libcsfml-window.so (libc6) => /usr/local/lib/libcsfml-window.so
   libcsfml-window.so (libc6) => /usr/lib/libcsfml-window.so
   libcsfml-system.so.2 (libc6) => /usr/local/lib/libcsfml-system.so.2
   libcsfml-system.so.2 (libc6) => /usr/lib/libcsfml-system.so.2
   libcsfml-system.so (libc6) => /usr/local/lib/libcsfml-system.so
   libcsfml-system.so (libc6) => /usr/lib/libcsfml-system.so
   libcsfml-network.so.2 (libc6) => /usr/local/lib/libcsfml-network.so.2
   libcsfml-network.so.2 (libc6) => /usr/lib/libcsfml-network.so.2
   libcsfml-network.so (libc6) => /usr/local/lib/libcsfml-network.so
   libcsfml-network.so (libc6) => /usr/lib/libcsfml-network.so
   libcsfml-graphics.so.2 (libc6) => /usr/local/lib/libcsfml-graphics.so.2
   libcsfml-graphics.so.2 (libc6) => /usr/lib/libcsfml-graphics.so.2
   libcsfml-graphics.so (libc6) => /usr/local/lib/libcsfml-graphics.so
   libcsfml-graphics.so (libc6) => /usr/lib/libcsfml-graphics.so
   libcsfml-audio.so.2 (libc6) => /usr/local/lib/libcsfml-audio.so.2
   libcsfml-audio.so.2 (libc6) => /usr/lib/libcsfml-audio.so.2
   libcsfml-audio.so (libc6) => /usr/local/lib/libcsfml-audio.so
   libcsfml-audio.so (libc6) => /usr/lib/libcsfml-audio.so

il semble trouver les lib, mais en double. Il y a peut-être conflit entre /usr/lib et /usr/local/lib...

le fichier /etc/ld.so.conf

    include /etc/ld.so.conf.d/*.conf

les répertoires contenus dans les fichiers /etc/ld.so.conf.d :

    /usr/local/lib (ha, celui là me plaît, mais son petit copain /usr/lib n'est pas présent)
    /usr/lib/i386-linux-gnu/mesa-egl
    /usr/lib/i386-linux-gnu/mesa
    /lib/i386-linux-gnu
    /usr/lib/i386-linux-gnu
    /lib/i686-linux-gnu
    /usr/lib/i686-linux-gnu

Est-ce que la présence de /usr/local/lib permet de dire que le répertoire qui contient CSFML est connu du chargeur de bibliothèques?

A tout hasard, test en supprimant les lib de /usr/lib pour éviter les doublons (commande sudo ldconfig pour mettre à jour le cache)... sans plus de résultat.
Je continue mes recherches.
Titre: Re : Linux + MonoDevelop : System.DllNotFoundException: csfml-window-2
Posté par: Laurent le Juin 03, 2013, 08:51:42 pm
Déjà c'est pas normal que tu aies des doublons de bibliothèques dans des endroits différents. Revois toute ton installation de SFML / CSFML / SFML.Net, et assure toi que tu n'as qu'une version de chaque (et la bonne tant qu'à faire) ;)
Titre: Re : Linux + MonoDevelop : System.DllNotFoundException: csfml-window-2
Posté par: HugoLescargot le Juin 04, 2013, 09:39:11 pm
Bonsoir,

J'ai fait le ménage, j'ai téléchargé à nouveau SFML / CSFML et SFML.NET tous en version 2.0, j'ai tout mis dans le usr/local/lib, j'ai relancé le ldconfig.

Il n'y a maintenant plus qu'une version de chaque librairie.

Cependant le problème persiste.

Il manque certainement un truc mais là je ne vois vraiment pas :'(

Y a-t-il des tests, des lignes de commandes à exécuter pour vérifier certaines choses, une configuration dans MonoDevelop que je n'aurais pas fait ou pas correctement?
Titre: Re : Linux + MonoDevelop : System.DllNotFoundException: csfml-window-2
Posté par: Laurent le Juin 04, 2013, 09:41:21 pm
Aucune idée, désolé :-\

Personnellement je ne développe en .Net que sous Windows.
Titre: Re : Linux + MonoDevelop : System.DllNotFoundException: csfml-window-2
Posté par: HugoLescargot le Juin 09, 2013, 07:25:42 pm
Bonsoir,

Juste pour information, j'ai installé un Linux tout propre puis j'ai compilé et testé SFML et CSFML avec des exemples basiques.
Tout marche pour le mieux, les librairies sont dans le /usr/local/lib (via sudo make install) et sont reconnues sans devoir préciser le chemin où les trouver lors de la compilation  des programmes avec g++ ou gcc.

La commande ldconfig me retourne les bons noms de librairies sans doublon.

Cependant l'exemple SFML.NET ne fonctionne toujours pas (via MonoDevelop).

Je continue donc à chercher du côté de la configuration de MonoDevelop, et de la "compilation" via la ligne de commande...
Titre: Re : Linux + MonoDevelop : System.DllNotFoundException: csfml-window-2
Posté par: HugoLescargot le Juin 14, 2013, 08:55:22 pm
Quelques nouvelles...

Le résultat de la commande ldconfig -p | grep libcsfml est toujours encourageant, on peut trouver les lignes suivantes,
libcsfml-graphics.so.2 (libc6) => /usr/local/lib/libcsfml-graphics.so.2
libcsfml-graphics.so (libc6) => /usr/local/lib/libcsfml-graphics.so

Par contre, la compilation en ligne de commande me donne toujours la même exception,
System.DllNotFoundException: csfml-graphics-2

Pour obtenir les informations de debug de mono, on a la commande suivante,
MONO_LOG_LEVEL=debug mono Test.exe

Et là,
Mono: DllImport attempting to load: 'csfml-graphics-2'.
Mono: DllImport loading library: '/home/user/Documents/testsfml.net2/libcsfml-graphics-2'.
Mono: DllImport error loading library '/home/user/Documents/testsfml.net2/libcsfml-graphics-2: Ne peut ouvrir le fichier d'objet partagé: Aucun fichier ou dossier de ce type'.
Mono: DllImport loading library: '/home/user/Documents/testsfml.net2/libcsfml-graphics-2.so'.
Mono: DllImport error loading library '/home/user/Documents/testsfml.net2/libcsfml-graphics-2.so: Ne peut ouvrir le fichier d'objet partagé: Aucun fichier ou dossier de ce type'.
Mono: DllImport loading location: 'libcsfml-graphics-2'.
Mono: DllImport error loading library: 'libcsfml-graphics-2: Ne peut ouvrir le fichier d'objet partagé: Aucun fichier ou dossier de ce type'.
Mono: DllImport loading location: 'libcsfml-graphics-2.so'.
Mono: DllImport error loading library: 'libcsfml-graphics-2.so: Ne peut ouvrir le fichier d'objet partagé: Aucun fichier ou dossier de ce type'.

En gros mon fichier csfml-graphics-2.dll.config contenant,
<configuration>
   <dllmap dll="i:csfml-graphics-2" target="libcsfml-graphics.so.2" os="!windows"/>
</configuration>
n'est pas pris en compte.

Par contre en modifiant le fichier /etc/mono/config en ajoutant la ligne,
<dllmap dll="i:csfml-graphics-2" target="libcsfml-graphics.so.2" os="!windows"/>

CELA FONCTIONNE! :)

Mais cette solution me parait bizarre :(

On a proposé une solution plus propre à une autre personne mais je ne la comprend pas, si une bonne âme pouvait me l'expliquer? Quelle est l'assembly P/Invoke pour csfml-graphics-2?

lupus :

Are all of your DllImport attributes in the code using "openal32.dll" or are some using "openal32" instead? In any case the config file refers to the assembly that contains the P/Invoke methods: the most likely issue is that you created the config for the main assembly while the P/Invoke methods are in a separate library assembly. Just rename the file to OpenAlUsingAssembly.dll.config.

Calmarius  :

That was the problem... I wrote the config file to the wrong assembly. One of my references use the dll not the main application.

Merci d'avance.

PS : sinon je ferais avec la grosse bidouille, c'est toujours mieux que rien...
Titre: Re : Linux + MonoDevelop : System.DllNotFoundException: csfml-window-2
Posté par: HugoLescargot le Juin 14, 2013, 10:29:44 pm
Solution :

Si vous avez, lors de l'exécution du programme, le message d'erreur :
System.DllNotFoundException: csfml-graphics-2

créer dans le répertoire où se trouve le programme le fichier :
sfmlnet-graphics-2.dll.config

contenant les lignes :
<configuration>
   <dllmap dll="i:csfml-graphics-2" target="libcsfml-graphics.so.2" os="!windows"/>
</configuration>


A adapter pour les différentes librairies...

Suite à cela, l'exemple fonctionne sans problème sur ma machine.