2017-10-13 5 views
1

Je suis en train d'écrire un programme pour une évaluation uni et ils ont une ligne fixe pour le compiler, donc si ça ne marche pas, ça ne sera pas accepté. Ils commandent qu'ils utilisent est-lm ne fonctionne que si c'est à la fin de la commande

gcc -Wall -ansi -lm program.c -o program.out 

Mon programme ne compile pas de cette façon, et ça va me donner une erreur de referance non définie (Se référant à ma log10 en utilisant la bibliothèque math.h) si je l'utilise:

cela fonctionne

Quel pourrait être mon problème? Im utilisant Windows 10 64bit et avoir Windows bash installé et gcc.

+0

Quelle est la version du compliler gcc? –

+0

Ceci est cohérent avec la façon dont GCC, au moins, s'est toujours comporté pour moi - il ne résoudra que les noms d'une unité de compilation donnée (par exemple le fichier objet créé depuis 'program.c') en adresses dans une unité de compilation ultérieure (comme' libm.a', ou serait-ce 'm.lib' sur Windows?). Je suis donc surpris que votre université s'attend à ce que la compilation fonctionne avec '-lm' avant le fichier source. –

+0

Im utilisant gcc 5.4.0! Oui, je pense la même chose, mais je ne suis pas sûr de savoir quoi faire .. À moins qu'il y ait un peu de travail pour le faire fonctionner! – Paloking

Répondre

0

-lm-lm doit être à la fin de la commande, probablement dans le premier cas avec le littéral, le compilateur optimise l'appel à function et n'a donc pas besoin de lier à la bibliothèque. On appelle cela constant folding et, par exemple, nous pouvons voir dans les gcc docs sur Other Built-in Functions Provided by GCC dit:

GCC comprend des versions intégrées de la plupart des fonctions de la bibliothèque standard C . Les versions préfixées avec __builtin_ sont toujours traitées comme ayant la même signification que la fonction de bibliothèque C même si vous spécifiez l'option -fno-builtin. (voir Options C Dialect) Beaucoup de ces fonctions ne sont optimisées que dans certains cas; s'ils ne sont pas optimisés dans un cas particulier, un appel à la fonction de bibliothèque est émis.

2

Ceci peut être expliqué si vos instructeurs utilisent de l'or et que vous utilisez GNU ld. Ce sont deux liens, les deux font partie du projet GNU, et les deux sont couramment utilisés avec GCC.

Si vous utilisez ld GNU, vous obtenez le comportement « traditionnel »:

L'ordre de spécifier les options -L et -l, et l'ordre de la spécification des options -l par rapport aux opérandes pathname est significatif.

Cela signifie que vous devez mettre -lmaprès des fichiers objets et les bibliothèques qui en dépendent. Toutefois, si vous utilisez de l'or, les options -l peuvent apparaître en premier.

Si l'or est installé sur votre système, vous pouvez le tester vous-même.

Voici ce que je reçois:

$ gcc -lm program.c 
/tmp/ccJmBjmd.o: In function `main': 
program.c:(.text+0x15): undefined reference to `sin' 
collect2: error: ld returned 1 exit status 

Mais si j'utilise l'or, il fonctionne très bien:

$ gcc -lm program.c -fuse-ld=gold