2010-02-02 5 views
1

J'ai une configuration fonctionnelle, où tous les fichiers sont dans le même répertoire (bureau). La sortie du terminal est comme ceci:La question du débutant, essayant de comprendre comment l'éditeur de liens recherche une bibliothèque statique

$ gcc -c mymath.c 
$ ar r mymath.a mymath.o 
ar: creating archive mymath.a 
$ ranlib mymath.a 
$ gcc test.c mymath.a -o test 
$ ./test 
Hello World! 
3.14 
1.77 
10.20 

Les fichiers:

mymath.c:

float mysqrt(float n) { 
    return 10.2; 
} 

test.c:

#include <math.h> 
#include <stdio.h> 
#include "mymath.h" 

main() { 
    printf("Hello World!\n"); 
    float x = sqrt(M_PI); 
    printf("%3.2f\n", M_PI); 
    printf("%3.2f\n", sqrt(M_PI)); 
    printf("%3.2f\n", mysqrt(M_PI)); 
    return 0; 
} 

Maintenant, je propose l'archive MyMath .a dans un sous-répertoire/temp. Je ne l'ai pas été en mesure d'obtenir la mise en relation au travail:

$ gcc test.c mymath.a -o test -l/Users/telliott_admin/Desktop/temp/mymath.a 
i686-apple-darwin10-gcc-4.2.1: mymath.a: No such file or directory 

$ gcc test.c -o test -I/Users/telliott_admin/Desktop/temp -lmymath 
ld: library not found for -lmymath 
collect2: ld returned 1 exit status 

Qu'est-ce que je manque? Quelles ressources recommanderiez-vous?

Mise à jour: Merci pour votre aide. Toutes les réponses étaient fondamentalement correctes. J'ai blogué à ce sujet here.

Répondre

1

Pour inclure les bibliothèques mathématiques, utilisez -lm, not -lmath. En outre, vous devez utiliser -L avec le sous-répertoire pour inclure la bibliothèque lors de la liaison (-I inclut simplement l'en-tête pour la compilation).

Vous pouvez compiler et lier avec:

gcc test.c -o test -I/Users/telliott_admin/Desktop/temp /Users/telliott_admin/Desktop/temp/mymath.a 

ou

gcc test.c -o test -I/Users/telliott_admin/Desktop/temp -L/Users/telliott_admin/Desktop/temp -lmymath 

où mymath.a est renommé libmymath.a.

Voir link text pour commentaires (recherche de « mauvaise programmation ») sur les pratiques de l'utilisation -l:

+0

Désolé pour le typo. Je suis à la recherche de ma propre bibliothèque "fake": mymath qui est dans/temp – telliott99

+0

Yep. Ces deux ont travaillé pour moi. Merci. – telliott99

2
$ gcc test.c /Users/telliott_admin/Desktop/temp/mymath.a -o test 

modifier: gcc a besoin que le chemin complet à la bibliothèque pour les bibliothèques statiques. Vous utilisez -L pour donner un chemin où gcc devrait chercher en conjonction avec -l.

1

Pour que ld trouve une bibliothèque avec -l, elle doit être nommée selon le modèle lib votre nom .a. Alors vous utilisez -lmymath

Donc, il n'y a aucun moyen de l'obtenir pour prendre /temp/mymath.a avec -l.

Si vous l'appeliez libmymath.a, alors -L/temp -lmymath le trouverait.

Questions connexes