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 Exemple: p> helloworld.c b> p> helloworld.c code> à l'aide d'une fonction de bibliothèque CS50, GCC ne veut pas jouer. P>
$ gcc helloworld.ca P>
/tmp/ccYilBgA.o: In function `main':
helloWorld.c:(.text+0x16): undefined reference to `GetString'
collect2: ld returned 1 exit status
6 Réponses :
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)
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 alors vous manquez probablement de la bibliothèque spécifique de Harvard, certaines options telles que Notez que l'ordre des arguments du programme à Options de répertoire Très rapidement, vous voudrez utiliser Build Automation Outils tels que GNU Apprenez aussi à Utilisez le débogueur 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! P>
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 Amusez-vous. P> gcc -wall -g code>. Mais à un moment donné, lisez Comment invoquer
gcc code> em>
. 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 em> Détails de la compilation de votre part). p>
-l code> suivi d'un répertoire de bibliothèque, puis
-l code> collé sur le nom de la bibliothèque. Donc, vous auriez peut-être besoin de
gcc -wall -g -lcs50 code> (remplacer
CS50 code> par le nom approprié) et vous avez peut-être besoin de
-l code> certains-dir em> p>
GCC code> est significatif. En règle générale, si
A code> dépend du
B code>, vous devez mettre
a code> avant
b code>; plus spécifiquement je suggère p>
-std = c99 code> si WAND LI>
-wall -g code> (vous pouvez même souhaiter ajouter
-wextra code> pour obtenir encore plus d'avertissements). < / li>
-done = 1 code> et
-imy-include-dir / code> li>
hello.c code> li>
bar.o code> li>
-LMY-LIB-DIR / CODE> Si pertinent LI>
-Laa code> et
-LBB code> (lorsque le
libaa.so code> dépend du
libbb.so code >, dans cet ordre) li>
-O votre nom-programme code> pour donner le nom du binaire produit. N'utilisez pas le nom par défaut
a.out code> li>
ol>
-I code> (pour le préprocesseur comprend) et
-l code> pour les bibliothèques peut être donnée plusieurs fois, la commande est significative (ordre de recherche). P>
marque code>
(peut-être avec le Aide de Remake Code>
sur Linux) P>
gdb code>
. p>
Guile code> 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 P>
Vous devez créer un lien avec la bibliothèque, comment se trouver GCC savoir quelle bibliothèque que vous souhaitez utiliser?
ou ============================================== ========================> P>
Si vous avez besoin d'aide, vous pouvez me demander à Faizan4427@gmail.com et si cela a fonctionné, veuillez voter. P>
Tout le meilleur !!! p>
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.
Assurez-vous que votre compilateur fonctionne. Jetez-le ce code simple, P>
Documents CD / Harvard_CS50 / semaine2 / P>
blockQuote>
gcc helloworld.c -o helloworld.exe p>
blockQuote>
./ helloworld.exe p>
Bonjour Stackoverflow p>
blockQuote>
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> 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>
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>
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>
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>
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 ls p>
CS50.C CS50.H CS50.O LIBCS50.A P>
blockQuote> li>
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>
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> 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>
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"
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 code>. 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 code> qui contenait la < Code> Inclure code> et
lib code> 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).
Sources de recherche: p>
Approche: P>
Mon environnement: P>
GCC code> via MSYS2 LI>
- shell:
bash code> via MSYS2 LI>
- IDE: ne compte pas ici li>
ul>
plan: p>
- Obtenir les fichiers source li>
- Construction des fichiers requis:
*. o code> (objet) et *. A code> (archive) li>
- Dire au compilateur de l'utiliser li>
ol>
action: p>
-
disons, répertoire actuel = "bureau / cs50"
Il contient tous les fichiers *. C code> comme test-file.c que je créerai pour des missions / des ensembles de problèmes / la pratique, etc. P>
li>
-
Obtenez le *. H code> et *. C code> Les fichiers
Source dans ce cas particulier: https://github.com/cs50/libcs50/tree/ Main / SRC P>
- Passez sur chaque fichier individuellement LI>
- Copiez tout le contenu de celui-ci
Dites en utilisant "Copier le contenu brut" Icône de fichiers individuels li>
- 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 CODE> LI>
ol>
li>
-
Construisez les fichiers requis à l'aide du terminal après avoir changé votre répertoire actuel sur "Desktop / CS50 / SRC": P>
-
gcc -c cs50.c code> pour créer le fichier d'objet "cs50.o" à partir de "cs50.c" à l'aide "GCC" LI>
-
arr libcs50.a cs50.o code> Pour créer "libcs50.a" fichier archive qui contient un fichier d'objet "cs50.o"
li>
ol>
- Ici, "libcs50" = "lib" Préfixe + "CS50" Nom (identique au nom du fichier d'en-tête) li>
- Il s'agit de la norme / la voie standard où le préfixe "lib" est aussi significatif pour une étape ultérieure li>
- 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 li>
ul>
li>
-
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 "): P>
-
GCC test-file.c -lsrc -lcs50 code> Si vous avez utilisé "LIB" préfixe à l'étape 2.2 ci-dessus li>
- ici,
-i code> est destiné à spécifier le répertoire du fichier *. h code> fichier d'en-tête inclus dans votre test_file.c li>
- et
-L code> Pour spécifier le répertoire à utiliser pour -l code> li>
- et
-l code> est destiné au nom du fichier *. A fichier code>. Ici, le préfixe "lib" a parlé de plus tôt, et ".a" extension n'est pas mentionné Li>
- L'ordre de ces indicateurs importe, conserver les indicateurs
-I -L -L -L -L -L -L -L CODE> après le "test-file.c" li>
ul>
li>
ol>
Quelques notaires supplémentaires: P>
- N'oubliez pas d'utiliser les drapeaux communs supplémentaires (comme ceux suggéré ci-dessus pour les erreurs, etc.) li>
- Si vous avez sauté le préfixe "LIB", vous ne pouvez pas utiliser
-l -l -l -l code> drapeaux
Donc, la syntaxe for Commande deviendra: GCC test-file.c -src src / libcs50.a code> li>
- dis que j'ai créé mon
test-file.c code> fichier dans "bureau / CS50 / PEETS", il peut donc être traité à 2 manières notables (Dir actuel = "Desktop / CS50 /") :
-
CD PEETS CODE> Modification de l'adresse relative correspondant en conséquence dans -I -L code>, donc le résultat:
gcc-file-file.c -i ../ src -l ../ src -lcs50 code> li>
- 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 CODE> LI>
- ou utilisez des adresses absolues 😜 li>
ul>
li>
- Comme on peut le voir que cela devient assez long, c'est lorsque vous construisez des outils d'automatisation tels que
faire code> kick in. li>
ul>
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 code> 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 code> fonctionnerait comme
#include code>.