7
votes

Inclure une bibliothèque externe en C

Je tente d'utiliser une bibliothèque C pour un cours OpenCoursworks de Harvard. Les instructions de l'instructeur pour la mise en place de la liberme externe peuvent être trouvées ici .

Je suis à la suite des instructions spécifiques à Ubuntu, car j'essaie d'utiliser cette libère sur ma boîte Ubuntu. J'ai suivi les instructions sur la page pour la configurer, mais lorsque j'exécute un programme simple helloworld.c code> à l'aide d'une fonction de bibliothèque CS50, GCC ne veut pas jouer. P>

Exemple: p>

helloworld.c b> p> xxx pré>

$ gcc helloworld.ca P>

/tmp/ccYilBgA.o: In function `main':
helloWorld.c:(.text+0x16): undefined reference to `GetString'
collect2: ld returned 1 exit status


5 commentaires

L'inclusion du fichier d'en-tête marque simplement le prototype de la fonction. Par conséquent, votre fichier compile bien, mais il y a une erreur de liaison. Avez-vous installé les bibliothèques comme suggérées? Si tel est le cas, pouvez-vous vérifier si les bibliothèques sont correctement installées et que la variable de chemin est correctement définie pour que GCC puisse trouver ces bibliothèques à l'aide du chemin?


Est-ce que gcc helloworld.c -lcs50 fonctionne?


Oui, n'a pas réalisé que je devais créer explicitement un lien explicitement à la libère de la ligne CMD. Merci à tous.


Comment va-t-il savoir que vous voulez créer un lien avec cette bibliothèque?


Je pensais #include fonctionnerait comme #include .


6 Réponses :


3
votes

Vous devez créer un lien contre la bibliothèque pendant la compilation. La bibliothèque doit se terminer par ou .so si vous êtes sur Ubuntu. Pour créer un lien avec une bibliothèque:

gcc -o myProgram myProgram.c -l(library name goes here but no parentheses)


0 commentaires

33
votes

Premièrement, en tant que débutant, vous devez toujours demander à GCC de compiler avec toutes les avertissements et les informations de débogage activées, c'est-à-dire gcc -wall -g . Mais à un moment donné, lisez Comment invoquer gcc . Utilisez un bon Editeur de code source (tel que gnu emacs ou vim ou geit , etc ...) Pour éditer votre code source C, mais être capable de compiler votre programme sur la ligne de commande (donc don ' t toujours utiliser un IDE masquant Important Détails de la compilation de votre part).

alors vous manquez probablement de la bibliothèque spécifique de Harvard, certaines options telles que -l suivi d'un répertoire de bibliothèque, puis -l collé sur le nom de la bibliothèque. Donc, vous auriez peut-être besoin de gcc -wall -g -lcs50 (remplacer CS50 par le nom approprié) et vous avez peut-être besoin de -l certains-dir

Notez que l'ordre des arguments du programme à GCC est significatif. En règle générale, si A dépend du B , vous devez mettre a avant b ; plus spécifiquement je suggère

  1. Démarrer avec le nom du programme GCC ; Ajoutez le niveau standard c par exemple -std = c99 si WAND
  2. Mettez des options d'avertissement du compilateur, de débogage (ou d'optimisation), par exemple -wall -g (vous pouvez même souhaiter ajouter -wextra pour obtenir encore plus d'avertissements). < / li>
  3. Mettez les définitions du préprocesseur et incluent le répertoire E.G. -done = 1 et -imy-include-dir /
  4. Mettez votre C fichier source hello.c
  5. Mettez des fichiers d'objets avec lesquels vous reliez I.e. bar.o
  6. Mettez les annuaires de la bibliothèque -LMY-LIB-DIR / Si pertinent
  7. PUR Les noms de la bibliothèque -Laa et -LBB (lorsque le libaa.so dépend du libbb.so , dans cet ordre)
  8. fin avec -O votre nom-programme pour donner le nom du binaire produit. N'utilisez pas le nom par défaut a.out

    Options de répertoire -I (pour le préprocesseur comprend) et -l pour les bibliothèques peut être donnée plusieurs fois, la commande est significative (ordre de recherche).

    Très rapidement, vous voudrez utiliser Build Automation Outils tels que GNU marque (peut-être avec le Aide de Remake sur Linux)

    Apprenez aussi à Utilisez le débogueur gdb .

    Obtenez l'habitude de toujours demander des avertissements au compilateur et améliorez toujours votre programme jusqu'à ce que vous ne receviez aucun avertissement: le compilateur est votre ami, cela vous aide!

    lire aussi Comment déboguer de petits programmes < / em> et le célèbre SICP (qui enseigne des concepts très importants; vous voudrez peut-être Utilisez Guile sur Linux tout en le lisant, voir < Un href = "http://norvig.com/21-days.html" rel = "noreferrer"> http://norvig.com/21-days.html pour plus). Soyez également au courant d'outils tels que Valgrind

    Amusez-vous.


0 commentaires

2
votes

Vous devez créer un lien avec la bibliothèque, comment se trouver GCC savoir quelle bibliothèque que vous souhaitez utiliser? XXX


0 commentaires

2
votes
  1. Téléchargez le CS50 à partir de: http://mirror.cs50.net /Library50/c/Library50-C-5.zip
  2. extraire-le. (Vous obtiendrez deux fichiers CS50.C et CS50.H)
  3. Copiez maintenant les fichiers dans votre dossier de la bibliothèque par défaut. (qui comprend votre fichier stdio.h)
  4. Maintenant, en écrivant votre programme Utilisez: #include
  5. Vous pouvez également copier les fichiers dans le dossier contenant votre fichier helloworld.c.
  6. vous devez utiliser: #include "cs50.c".

    ou ============================================== ========================>

    1. Ouvrir les fichiers CS50.c et CS50.H dans l'éditeur de texte.
    2. dans cs50.h, juste en dessous de #include ajouter #include et #include à la fois sur la nouvelle ligne.
    3. Ouvrez maintenant le fichier CS50.C, copiez tout (de: / ** lit une ligne de texte à partir de l'entrée standard et renvoie l'équivalent {de la ligne 47 à la dernière}) et la coller dans cs50.h juste au-dessus du #undi et enregistrer les fichiers.
    4. Vous pouvez maintenant copier le fichier CS50.h vers votre dossier de la bibliothèque par défaut ou sur votre dossier de travail actuel.
    5. Si vous avez copié le fichier dans le dossier par défaut, utilisez: #include et si vous avez copié les fichiers vers le dossier de travail actuel, utilisez: #include "cs50.h".

      Si vous avez besoin d'aide, vous pouvez me demander à Faizan4427@gmail.com et si cela a fonctionné, veuillez voter.

      Tout le meilleur !!!


0 commentaires

4
votes

Je prends ce cours et parfois j'ai besoin de pratiquer hors ligne pendant que je voyage ou de la navette. Sous Windows à l'aide de Mingw et Notepad ++ comme une IDE (parce que je l'aime et utilisez-le généralement pendant que le codding python) J'ai enfin trouvé une solution et un peu de temps pour l'écrire.

à partir de zéro. Étapes pour la configuration du compilateur GCC C, si déjà défini, passez à 5 forte> p>

  1. télécharger git et installer. Il comprend Git Bash, qui est terminal Mingw64 Linux. Je préfère utiliser GIT comme j'ai besoin d'outils Linux tels que SED, Awk, Tirez, appuyez sur mes fenêtres et peut remplacer le terminal de GutHub. Li>
  2. Une fois GIT installé Assurez-vous que les packages GCC sont installés. Vous pouvez utiliser ma configuration pour référence ...  Mingw Installation Manager - GCC LI>
  3. Assurez-vous que votre compilateur fonctionne. Jetez-le ce code simple, P>

    • En l'enregistrant dans votre répertoire de travail Documents / Harvard_CS50 / semaine2 / EM> bonjour.c strong> li> ul>
      npp_save
      gcc -ggdb -std=c99 -Wall -Werror "$(FULL_CURRENT_PATH)" -lcs50 -o "$(CURRENT_DIRECTORY)\$(NAME_PART).exe"
      cmd /c "$(CURRENT_DIRECTORY)\$(NAME_PART).exe"
      
      • Début git bash em> -> Accédez au répertoire de travail LI> ul>

        Documents CD / Harvard_CS50 / semaine2 / P> blockQuote>

        • Compilez-le dans Terminal Bash Li> ul>

          gcc helloworld.c -o helloworld.exe p> blockQuote>

          • exécutez-le à l'aide de Bash Terminal Li> ul>

            ./ helloworld.exe p>

            Bonjour Stackoverflow p> blockQuote>

            1. Si vous voyez Hello StackoverflowFlow Strong>, votre compilateur fonctionne et vous pouvez écrire C code. li> ol> li> ol>

              maintenant au bit important, installant la bibliothèque CS50 localement et en l'utilisant hors ligne. Cela devrait être applicable pour toute autre bibliothèques introduite ultérieurement dans le cours. Strong> p>

              1. Télécharger le dernier fichier de code source CS50.C et fichier d'en-tête CS50.h de https://github.com/cs50/libcs50/tree/develop/src et enregistrez-les dans Documents / Harvard_CS50 / SRC EM> P> L>

              2. Naviguez dans le répertoire SRC et répertoriez les fichiers pour vous assurer que vous êtes au bon endroit en utilisant p>

                ls p>

                CS50.C CS50.H P> blockQuote> li>

              3. cool, nous sommes ici. Maintenant, nous devons compiler un fichier objet pour la bibliothèque en utilisant p>

                GCC -C -GGDB -STD = C99 CS50.C -O CS50.O P> blockQuote> li>

              4. Utilisez maintenant le fichier objet CS50.o généré, nous pouvons créer notre fichier d'archive de la bibliothèque CS50. P>

                ar rcs libcs50.a cs50.o p> blockQuote> li>

              5. Après toutes ces étapes, nous avons terminé 2 fichiers supplémentaires à nos fichiers d'origine. Nous ne sommes intéressés que par 2 d'entre eux cs50.h strong> libcs50.a strong> p>

                ls p>

                CS50.C CS50.H CS50.O LIBCS50.A P> blockQuote> li>

              6. Copier la bibliothèque et les fichiers d'en-tête vers leurs emplacements cibles. Mon Mingw est installé dans c: \ donc je les copie là-bas p>

                cs50.h -> c: \ mingw \ include strong> p>

                libcs50.a -> c: \ mingw \ lib strong> p> li> ol>

                Test de la bibliothèque CS50 forte> p>

                Pour vous assurer que notre bibliothèque fonctionne, nous pouvons lancer l'un des scripts d'exemple dans la conférence et voir si nous pouvons la compiler Utilisation du fichier d'en-tête CS50.H pour la méthode get_string (). p> xxx pré>

                1. Compilez le code CS50 à l'aide de la bibliothèque GCC et CS50. Je veux être explicite et utiliser: p>

                  gcc -ggdb -std = c99 -wall -werror test.c -lcs50 -o test.exe p> blockQuote>

                  Mais vous pouvez simplement signaler la source, le nom de fichier de sortie et la bibliothèque CS50 p>

                  GCC Test.c -O Test.exe -LCS50 P> blockQuote> li> ol>

                  Nous allons ici, le programme est compilé à l'aide d'en-tête et de méthodes peut être utilisé à l'intérieur. P>

                  Si vous voulez NotePad ++ comme IDE, vous pouvez suivre cet embout pour le configurer avec GCC en tant que compilateur et exécuter votre code de là A >. Assurez-vous simplement que votre script NPPEXEC inclut la bibliothèque CS50 P> xxx pré>

                   code CS50 dans le bloc-notes ++ p> p>


1 commentaires

Réponse parfaite pour les utilisateurs Windows! Merci pour l'explication approfondie avec des images. Je voudrais ajouter cela pour l'étape 10, l'emplacement de dossier que vous recherchez doit contenir le fichier stdio.h . Pour moi, c'était: C: \ Program Files \ Mingw-W64 \ x86_64-8.1.0-POSIX-SEH-RT_V6-REV0 \ MINGW64 \ x8 6_64-W64-MINGW32 qui contenait la < Code> Inclure et lib Dossiers dont j'avais besoin. De plus, grâce à Faizan-Rizvi, qui a fourni un indice supplémentaire dans sa réponse (option 2, étape 2).



0
votes

Sources de recherche:

  • bâtiment sur les réponses ci-dessus donné par Starynkevitch Basile et Gunay Anach
  • combiné avec des instructions de certaines vidéos sur YouTube 1 < / a> 2

    Approche:

    • couvrant les éléments minimaux à faire et partager les "normes" séparément
    • Éviter toute modification de n'importe où ailleurs sur le système
    • y compris la ventilation de base des commandes utilisées
    • n'incluant pas tous les détails fins, couvrant uniquement les exigences absolues à la tâche ou à une communication efficace des instructions. laissant les autres détails mondains au lecteur
    • En supposant que les autres trucs comme compilateur, variable d'environnement, etc. sont déjà configurés et la familiarité avec les commandes de navigation de fichiers de Shell est là

      Mon environnement:

      • Compilateur: GCC via MSYS2
      • shell: bash via MSYS2
      • IDE: ne compte pas ici

        plan:

        1. Obtenir les fichiers source
        2. Construction des fichiers requis: *. o (objet) et *. A (archive)
        3. Dire au compilateur de l'utiliser

          action:

          1. disons, répertoire actuel = "bureau / cs50"
            Il contient tous les fichiers *. C comme test-file.c que je créerai pour des missions / des ensembles de problèmes / la pratique, etc.

          2. Obtenez le *. H et *. C Les fichiers
            Source dans ce cas particulier: https://github.com/cs50/libcs50/tree/ Main / SRC

            1. Passez sur chaque fichier individuellement
            2. Copiez tout le contenu de celui-ci
              Dites en utilisant "Copier le contenu brut" Icône de fichiers individuels
            3. Créez le fichier correspondant localement dans l'ordinateur
              Faites-le dans un dossier séparé juste pour garder les choses propres, disons dans "Desktop / CS50 / SRC" AKA ./ SRC
            4. Construisez les fichiers requis à l'aide du terminal après avoir changé votre répertoire actuel sur "Desktop / CS50 / SRC":

              1. gcc -c cs50.c pour créer le fichier d'objet "cs50.o" à partir de "cs50.c" à l'aide "GCC"
              2. arr libcs50.a cs50.o Pour créer "libcs50.a" fichier archive qui contient un fichier d'objet "cs50.o"
                • Ici, "libcs50" = "lib" Préfixe + "CS50" Nom (identique au nom du fichier d'en-tête)
                • Il s'agit de la norme / la voie standard où le préfixe "lib" est aussi significatif pour une étape ultérieure
                • Cependant, le préfixe peut être ignoré, et il n'est pas obligatoire pour le nom de correspondre non plus au nom du fichier d'en-tête. Cependant, sauter le préfixe n'est pas recommandé. Et je ne peux pas dire avec sûr de la partie
                • Pour dire au compilateur d'être en mesure d'utiliser cette infrastructure, les commandes suivent la syntaxe après avoir été allée dans le répertoire parent (c'est-à-dire "sur" Desktop / CS50 "):

                  • GCC test-file.c -lsrc -lcs50 Si vous avez utilisé "LIB" préfixe à l'étape 2.2 ci-dessus
                  • ici, -i est destiné à spécifier le répertoire du fichier *. h fichier d'en-tête inclus dans votre test_file.c
                  • et -L Pour spécifier le répertoire à utiliser pour -l
                  • et -l est destiné au nom du fichier *. A fichier . Ici, le préfixe "lib" a parlé de plus tôt, et ".a" extension n'est pas mentionné
                  • L'ordre de ces indicateurs importe, conserver les indicateurs -I -L -L -L -L -L -L -L après le "test-file.c"

                    Quelques notaires supplémentaires:

                    • N'oubliez pas d'utiliser les drapeaux communs supplémentaires (comme ceux suggéré ci-dessus pour les erreurs, etc.)
                    • Si vous avez sauté le préfixe "LIB", vous ne pouvez pas utiliser -l -l -l -l drapeaux
                      Donc, la syntaxe for Commande deviendra: GCC test-file.c -src src / libcs50.a
                    • dis que j'ai créé mon test-file.c fichier dans "bureau / CS50 / PEETS", il peut donc être traité à 2 manières notables (Dir actuel = "Desktop / CS50 /") :
                      • CD PEETS Modification de l'adresse relative correspondant en conséquence dans -I -L , donc le résultat:
                        gcc-file-file.c -i ../ src -l ../ src -lcs50
                      • garder le répertoire actuel identique, mais modifiant l'adresse relative du fichier en conséquence, donc le résultat:
                        GCC PESTS / TEST-FILE.C -IFRC -LSRC -LCS50
                      • ou utilisez des adresses absolues 😜
                      • Comme on peut le voir que cela devient assez long, c'est lorsque vous construisez des outils d'automatisation tels que faire kick in.

0 commentaires