IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

[Linux][MSYS2] tentative de portage d'une librairie partagée écrite en C


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 333
    Par défaut [Linux][MSYS2] tentative de portage d'une librairie partagée écrite en C
    Bonjour,

    Je me suis décidé à tenter (je sais que en ce qui concerne utf8 ça va être galère) de porter une librairie de fonctions partagée écrite dans l'environnement Linux.
    Elle fonctionne "parfaitement" sous Linux.

    Du coup, je me suis mis dans la tête de "voir" comment cela allait se passer dans l'environnement Windows.
    J'ai donc créé une machine virtuelle Win7 et j'ai installé MSYS2 et Cygwin.

    J'ai viré Cygwin immédiatement quand j'ai vu comment il affichait dans son terminal les caractères accentués me laissant deviner que la prise en charge des wide characters (wchar) allait être plus que pénible.
    (Ceci en ayant bien spécifié que mes locales étaient fr_BE.utf8 au niveau des paramètres du terminal sous Cygwin, donc --> poubelle)

    Sous MSYS2 là ça va... quand je lance mon makefile il fait la même chose que sous Cygwin: il n'y a pas de ldconfig ou équivalent du coup je cherche un équivalent pour me permettre de "linker" ma bibliothèque partagée (librairie fausse amie).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    hurukan@VirtualWin7 MSYS ~/projets/portages/uep_wide
    # make sharedlibrary
    Librairie partagée compilée...
    ...installation au niveau du système d'exploitation !!
    gcc -c -fPIC -O3 uep_wide.c -o libuepwide.o
    ...compilation des add-ons...
    gcc -c -fPIC -O3 setElementEx.c -o setElementEx.o
    gcc -c -fPIC -O3 getElementEx.c -o getElementEx.o
    gcc -c -fPIC -O3 getPIDByName.c -o getPIDByName.o
    ...compilation de la librairie...
    gcc -shared -Wl,-soname,libuepwide.so libuepwide.o setElementEx.o getElementEx.o getPIDByName.o -lpthread -lm -o libuepwide.so.1.0.1
    'libuepwide.so.1.0.1' -> '/usr/lib/libuepwide.so.1.0.1'
    ...linking...
    make: ldconfig: No such file or directory
    make: *** [makefile:22: sharedlibrary] Error 127
    Maintenant, comme sous Windows je ne suis pas certain que les .dll fonctionnent comme les bibliothèques partagées sous Linux... je cherche un moyen de faire comprendre
    au compilateur que je cherche à "inscrire" une librairie partagée au niveau du système.
    Quel serait l'équivalent de ldconfig dans l'environnement Windows ?

  2. #2
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 333
    Par défaut
    Pour détailler ce que j'attends de MSYS2:

    Dans l'environnement Linux, les librairies partagées se placent dans un répertoire particulier. A l'aide de l'application pkg-config il est possible d'intégrer facilement chaque librairie à une application qui utiliserait celles-ci.
    Dans mon cas je voudrais effectuer le "portage" de la librairie qui fonctionne sous Linux et essayer de voir si elle pourrait être utilisée aussi bien sous windows que Linux.

    J'ai des applications de test que je compte utiliser sous Windows pour valider le "portage".

    Concernant l'utilisation des "dll" sous Windows, j'espère ne pas devoir passer par les mécanismes propres à Windows, qui, au niveau de GNU ne semble pas nécessaire, mais la documentation est peu fournie à ce niveau.
    Ainsi je voudrais vérifier si il serait possible d'effectuer le "portage" (au moins ça compile) sans utiliser le mécanisme "declspec(dllexport)/LoadLibrary()" et, au niveau des utilitaires de test, ne pas devoir changer le code source.

    Mon makefile ressemble pour le moment à ceci...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    dllwin:	uep_wide.c uep_wide.h setElementEx.c getElementEx.c
    		@echo "Librairie partagée compilée..."
    		@echo "...installation au niveau du système d'exploitation !!"
    		gcc -c -fPIC -O3 uep_wide.c -o libuepwide.o
    		@echo "...compilation des add-ons..."
    		gcc -c -fPIC -O3 setElementEx.c -o setElementEx.o
    		gcc -c -fPIC -O3 getElementEx.c -o getElementEx.o
    		gcc -c -fPIC -O3 getPIDByName.c -o getPIDByName.o
    		@echo "...compilation de la librairie..."
    		gcc -shared -Wall libuepwide.o setElementEx.o getElementEx.o getPIDByName.o -lpthread -lm -o uep_wide.dll
    ...ce que je voudrais pouvoir faire c'est la même chose que sous Linux, si c'est possible, placer la librairie (dll) dans un répertoire et lorsque j'utilise pkg-config (disponible dans MSYS2) je puisse "profiter" du mécanisme avec un makefile du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CFLAGS=`pkg-config uepwide linkedlist --cflags`
    LDFLAGS=`pkg-config uepwide linkedlist --libs`
    
    test1: test1.c
    test2: test2.c
    test3: test3.c
    test4: test4.c

  3. #3
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 333
    Par défaut
    Pour pkg-config ça commence bien ^^
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    hurukan@VirtualWin7 MSYS ~/librairies/uep_wide
    # pkg-config.exe uepwide --cflags
    -I~/librairies/uep_wide
    
    hurukan@VirtualWin7 MSYS ~/librairies/uep_wide
    # pkg-config.exe uepwide --libs
    -L/usr/lib64 -luepwide -lpthread -lm
    Je vais faire des tests... et si ça marche je serais TRES content ^^

  4. #4
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 333
    Par défaut
    Voilà ce que ldd retourne...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    hurukan@VirtualWin7 MSYS /librairies/uep_wide
    # ldd uep_wide.dll
            ntdll.dll => /c/Windows/SYSTEM32/ntdll.dll (0x772b0000)
            kernel32.dll => /c/Windows/system32/kernel32.dll (0x77190000)
            KERNELBASE.dll => /c/Windows/system32/KERNELBASE.dll (0x7fefd3d0000)
            msys-2.0.dll => /usr/bin/msys-2.0.dll (0x180040000)
            advapi32.dll => /c/Windows/system32/advapi32.dll (0x7fefed00000)
            msvcrt.dll => /c/Windows/system32/msvcrt.dll (0x7fefd730000)
            sechost.dll => /c/Windows/SYSTEM32/sechost.dll (0x7fefd910000)
            RPCRT4.dll => /c/Windows/system32/RPCRT4.dll (0x7fefd7d0000)
            cryptbase.dll => /c/Windows/system32/cryptbase.dll (0x7fefcf40000)
    ...mais apparemment la dll n'est pas renseignée par le système et il n'existe pas de fichier de type ld.so.conf apparemment dans MSYS2 :{

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    hurukan@VirtualWin7 MSYS /librairies/uep_wide/tests/getnchar
    # make
    cc `pkg-config uepwide --cflags`  `pkg-config uepwide --libs`  test1.c   -o test1
    /usr/lib/gcc/x86_64-pc-msys/10.2.0/../../../../x86_64-pc-msys/bin/ld: cannot find -luepwide
    collect2: error: ld returned 1 exit status
    make: *** [<builtin>: test1] Error 1

  5. #5
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 333
    Par défaut
    J'ai beau me documenter je ne sais pas où spécifier à Windows que la .dll qui a l'air d'être reconnue en tant que telle via l'utilitaire ldd doit être chargée quand on le demande (lors de la compilation ici).

    Je vais essayer de la copier dans /usr/lib tout court au lieu de la copier dans /usr/lib64.

    EDIT: je ne vois pas ce que cela changerait... tant que la bibilothèque partagée n'est pas "enregistrée" au niveau du système.

    Le fichier ld.so.conf indique à Linux où chercher les librairies partagées...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /usr/local/lib64
    /usr/local/lib
    include /etc/ld.so.conf.d/*.conf

  6. #6
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 333
    Par défaut
    Il fallait mettre la librairie partagée dans /usr/bin.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/08/2017, 00h03
  2. [Linux] - Exécution d'un programme avec une librairie qui dépend d'une autre librairie
    Par neuromencien dans le forum Bibliothèques, systèmes et outils
    Réponses: 1
    Dernier message: 05/02/2017, 12h50
  3. Réponses: 1
    Dernier message: 02/12/2011, 13h53
  4. Réponses: 4
    Dernier message: 16/10/2006, 08h31
  5. Portage d'une librairie linux sous windows
    Par sleg dans le forum C++
    Réponses: 22
    Dernier message: 31/05/2005, 23h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo