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

Free Pascal Discussion :

Utiliser du code C avec Free Pascal sous Windows


Sujet :

Free Pascal

  1. #1
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 475
    Points : 779
    Points
    779
    Par défaut Utiliser du code C avec Free Pascal sous Windows
    Bonjour

    J'ai déjà posté ce message mais dans la section "général" du forum Pascal, je le mets dans la bonne section ... désolé pour le multipost.

    Je cherche à savoir comment je peux linker du code C (une bibliothèque statique par exemple) avec Free Pascal. Je suis tombé sur ce doument :
    http://mirror.mirimar.net/freepascal...FreePascal.pdf
    très bien fait au demeurant mais ne fonctionnant que sous Linux. Sous windows j'ai des probèmes à l'édition de liens. Est-ce que quelqu'un a adapté ça pour windows 32 ?

    Merci d'avance.
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  2. #2
    Membre éclairé

    Inscrit en
    Avril 2003
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 284
    Points : 773
    Points
    773
    Par défaut
    Le lien correct est :
    http://mirror.mirimar.net/freepascal...FreePascal.pdf

    Pour win32 ça revient à appeler une fonction externe depuis une dll...
    Car une dll sous win32 est l'equivalent d'un .o (library) sous linux...
    Il faut donc tout d'abord compiler ton code c avec un compilateur win32 sous forme de dll...

    A partir de là, dis nous si tu ne t'en sort pas, nous te montrerons comment faire...

    Bon courage

    Clandestino

  3. #3
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 475
    Points : 779
    Points
    779
    Par défaut
    Bonsoir,

    Merci pour la réponse rapide. En fait j'ai travaillé avec une dll que j'ai compilée avec GCC Mingw32 sous CODE:BLOCKS. C'était le programme d'essai de la doc. Puis j'ai écrit le wrapper en Pascal comme indiqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    unit helloU;
    {$link chello.o}
    {$linklib c}
    interface
    uses CTypes;
    procedure PrintHello; cdecl; external;
    procedure PrintHelloS(nme : ctypes.cint32); cdecl; external;
    implementation
    end.


    Mais j'ai un message d'erreur à l'édition de liens sur le deuxième import
    FPC me dit qu'il ne trouve pas la bibliothèque c.dll. J'en déduis qu'il faut que je change cette ligne peut-être avec {$linklib gcc}. Je vais fouiller un peu plus la doc et faire quelques tests. Comme je pars pendant trois jours sans ordinateur ce sera le week-end prochain.

    Merci en tout cas.
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  4. #4
    Membre éclairé

    Inscrit en
    Avril 2003
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 284
    Points : 773
    Points
    773
    Par défaut
    il suffit de rajouter le path de ton fichier c.dll dans ta ligne de commande de compilation ou dans ton fichier de configuration de fpc...
    Par exemple pour une dll c.dll contenue dans c:\temp ajouter
    Pour ceux qui utilisent Lazarus, ceci se fait simplement en choisissant le menu
    projet >>> options du compilateur
    puis dans la boite de dialogue qui s'ouvre choisir dans l'onglet chemin l'edit et le bouton associés à 'librairies' pour y inclure simplement le path voulu

  5. #5
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 475
    Points : 779
    Points
    779
    Par défaut
    Bonjour,

    Merci de cette réponse mais je pense que c'est un peu plus compliqué que ça. Le fameux fichier c.dll n'existe pas et je ne vois pas comment le créer...


    Voici ce que dit la doc (qui est pour Linux...)

    Then, there is two instructions for the linker. The first one {$link chello.o}
    means that the linker should link the program with the chello.o file [5, 4]. So the
    Free Pascal compiler will never know about what are truly those procedures, it will be
    the job of the linker to find them in the object file.
    Jusque là ça va, j'ai bien créé le fichier ad hoc en C puis compilé avec Mingw32 .

    Après la doc précise pour la ligne en cause :

    Doing so, a lot of references will appear to some functions typical of C. For example,
    it will find references to the print function and others defined in the <stdio.h>
    included. Those are defined in a shared library file, libc.so.
    Shared libraries are libraries that are not linked at linking time. So the linking of
    the program is not complete. The program will not run until it will have found the
    definition of, at least, the standard C functions. In fact, at execution time, a special
    program, ld-linux.so is called to charge in memory the binary definition of the
    missing procedures [3].
    Donc cette dll "c" va contenir les références aux bibliothèques standards du c (stdio.h et sdtlib.h à priori). Mais la doc ne précise pas où trouver cette bibliothèque c.dll ni comment la créer s'il faut se la faire soi-même.

    La suite de la doc ne m'avance pas plus :

    The linker needs to know at compile time, where to find not yet defined functions
    and procedure. First, to be able to build in the program binary instructions relative
    to which shared library has to be charged in memory. Second to test that at least, at
    linking time, every single procedure and function will be defined.
    Here we tell the linker to search in the file libc.so for missing definitions. It
    is the purpose of the instruction {$link c}.The linker will add a prefix lib and a
    suffix .so, in the Linux world to find the correct shared object file [5, 4].
    It is usually necessary to use also the {$link gcc}to link with libgcc.so if
    the C objects were created with GCC. Nonetheless this library might not have been
    produced during GCC compilation and therefore can be missing. Therefore, linking
    errors might occurs if this linking statement is present as well as if this statement is
    missing.
    Ce qui ne m'en dit pas plus sur cette libgcc.so ou libgcc.dll sous windows...
    Ne connaissant pas les arcanes de la programmation en C (tout ce que je sais je l'ai tiré d'un cours sur le "Site de zéro - fort bien fait - et de la lecture d'un bouquin, je suis donc loin d'êtere un spécialiste) je ne vois pas comment trouver ou créer cette dll, je comprends bien qu'elle contient les références aux bibliothèques standards du C mais que faut-il faire ? Compiler les fichiers stdio.h et . c en dll ?

    Je vais tester tout ça et je vous en dirai plus ...
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

Discussions similaires

  1. Réponses: 6
    Dernier message: 31/05/2015, 17h23
  2. [Flash Pascal] Écrire du code compilable avec Free Pascal
    Par Roland Chastain dans le forum Flash Pascal
    Réponses: 3
    Dernier message: 20/04/2014, 11h18

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