9
votes

SQRT () Fonction ne fonctionne pas avec des arguments variables

Je ne sais pas si je manque quelque chose d'évident, mais il semble que je ne puisse pas calculer des racines carrées d'une variable forte> en C; La fonction SQRT () semble uniquement fonctionner sur les constantes. Ceci est mon code:

gcc -Wall -o "test2" "test2.c" (in directory: /home/eddy/Code/euler)
/tmp/ccVfxkNh.o: In function `main':
test2.c:(.text+0x30): undefined reference to `sqrt'
collect2: ld returned 1 exit status
Compilation failed.


0 commentaires

7 Réponses :


21
votes

Vous devez créer un lien avec la bibliothèque de mathématiques (utilisez un '-LM' sur la ligne de commande). Dans le cas constant, le compilateur est probablement intelligent et précomptes SQRT (2.0) (le code compilé est donc essentiellement 'B = 1.414 ...;')


2 commentaires

C'est fastidieux. Qu'en est-il des autres bibliothèques, GCC a-t-il une option pour chacun d'eux?


@qed non, juste un: -l. Donc, -lm sélectionne une bibliothèque appelée "libm.a"; -LFrod0 sélectionnerait une bibliothèque appelée "libfrod0.a" en fait, elle a donc été depuis les temps anciens d'UNIX avant l'aube de GCC.



2
votes

Utilisez la commande gcc -wall -o "test2" "test2.c" -lm qui va probablement résoudre ce problème.

Ceci inclut la bibliothèque de mathématiques en plus de la bibliothèque d'exécution C standard C. Sur la plupart des systèmes, la bibliothèque de mathématiques est historiquement une entité distincte qui doit être explicitement demandée.


0 commentaires

1
votes

Compilez avec:

gcc -Wall -o test2 test2.c -lm


0 commentaires

0
votes

Cela fonctionne bien pour moi. Je pense qu'il y a un problème avec votre bibliothèque de mathématiques. Essayez de le lier à nouveau et voir. Un autre code sage est complètement parfait.


0 commentaires

1
votes

Inclure la bibliothèque de mathématiques à l'aide de "" Opérateur

gcc test.c -lm


1 commentaires

Le formulaire en op est plus correct pour les en-têtes standard. En outre, "math.h" (avec des espaces) ne fonctionnera pas.



1
votes

GCC ne lie pas les bibliothèques standard par défaut. Donc, vous avez juste besoin de le faire si la compilation via GCC:

GCC FileName.c -lm .

Cependant, dans le cas de g ++, aucun besoin de lier la bibliothèque de sorte que cela fonctionnera bien:

g ++ fileName.c -o nom de fichier


0 commentaires

2
votes

Dans le cas de GCC, vous devez relier la bibliothèque.

GCC FileName.c -lm.

Cependant, dans le cas de g ++, aucun besoin de lier la bibliothèque de sorte que cela fonctionnera bien:

G ++ FileName.c -O Nom de fichier Une fois la compilation réussie.

Pour exécuter simplement entrer ./filename dans g ++. et entrez ./a.out dans GCC.


0 commentaires