C - les symboles non définis pour l'architecture x86_64 lors de la compilation sous Mac OSX Lion
Je reçois quelques problèmes à la compilation d'un très très simple nom.c fichier sur Mac OSX Lion.
Maintenant, j'ai commencé à suivre Harvard CS50 cours sur cs50.net. Je ne suis pas totalement nouveau pour la programmation, mais j'étais curieux sur la façon dont ce cours a été enseigné.
C'est la source de nom.c:
#include <stdio.h>
#include <cs50.h>
int
main(void)
{
printf("State your name:\n");
string name = GetString();
printf("O hai, %s!\n", name);
return 0;
}
Comme vous pouvez le voir, elle a besoin de la bibliothèque: https://manual.cs50.net/CS50_Library.
Maintenant, quand je compile, ce qui se passe:
Undefined symbols for architecture x86_64:
"_GetString", referenced from:
_main in name-vAxcar.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [name] Error 1
Si j'utilise le même GetString() cs50.c de la fonction à l'intérieur de mon fichier source, il fonctionne parfaitement:
#include <stdio.h>
#include <string.h>
#include <float.h>
#include <limits.h>
#include <stdbool.h>
#include <stdlib.h>
typedef char *string;
string GetString(void);
int
main(void)
{
printf("State your name:\n");
string name = GetString();
printf("O hai, %s!\n", name);
}
string
GetString(void)
{
//CODE
}
Pourquoi cela se produit?
J'ai installé la bibliothèque comme il est dit sur le lien ci-dessus, je l'ai vérifié et les deux cs50.h et libcs50.un sont respectivement dans /usr/local/include et /usr/local/lib.
Je vous remercie d'avance pour votre aide.
-lcs50
à votre compilateur?Et également d'un bon
-L<some_directory>
pour indiquer au compilateur où chercher pour -lcs50
?OriginalL'auteur Pillo | 2012-08-24
Vous devez vous connecter pour publier un commentaire.
Le problème que vous rencontrez est dans l'étape de lien, pas de compilation. Vous n'avez pas fourni la mise en œuvre de
GetString
, seule sa déclaration (par le biais de la.h
fichier que vous#include
).De fournir à la mise en œuvre elle-même, vous avez généralement besoin d'un lien à l'encontre de la bibliothèque qui comprend; cela se fait habituellement par la
-l
drapeau àg++
. Par exemple,Votre deuxième exemple de code n'lien, parce que vous manuellement (et explicitement) de fournir une implémentation pour
GetString
, bien que vide.OriginalL'auteur user1071136