2010-10-11 14 views
2

j'ai écrit un programme de test comme celui-ci:Lier erreur dans Sun Studio 10 sous Solaris

#include <sys/socket.h> 
int main(void) { 
    int sock = socket(AF_INET, SOCK_DGRAM, 0); 
    return 0; 
} 

et a essayé de le compiler:

$ /tool/sunstudio/bin/cc test.c 
Undefined      first referenced 
symbol        in file 
socket        test.o 
ld: fatal: Symbol referencing errors. No output written to a.out 

La sortie est "prise de symbole n'est pas référencé".

Veuillez me donner la direction afin que je puisse résoudre ce problème.

+2

Quelle est l'erreur que vous obtenez? – codaddict

+0

Quelle est cette erreur de liaison? – claws

+0

fatal: erreurs de référencement de symbole. – Siddiqui

Répondre

6

Voici la question.

J'ai écrit un programme de test comme celui-ci:

#include <sys/socket.h> 
int main(void) { 
    int sock = socket(AF_INET, SOCK_DGRAM, 0); 
    return 0; 
} 

et a essayé de le compiler si (ce qui est la sortie qui aide vraiment, vous devez vous rappeler que les compilateurs modernes essaient vraiment de leur mieux pour vous aider à résoudre tout problèmes):

$ /tool/sunstudio/bin/cc test.c 
Undefined      first referenced 
symbol        in file 
socket        test.o 
ld: fatal: Symbol referencing errors. No output written to a.out 

maintenant, à partir de la sortie, nous pouvons voir non référencé le symbole socket. Donc, si vous tapez man socket vous obtiendrez ce qui suit de la page man:

SYNOPSIS 
    cc [ flag ... ] file ... -lsocket -lnsl [ library ... ] 

Le drapeau -l indique que pour utiliser cette fonction, vous devez lier également la bibliothèque nommée. Dans ce cas, on vous dit d'ajouter -lsocket -lnsl à la ligne de commande cc comme suit:

$ /tool/sunstudio/bin/cc test.c -lsocket -lnsl 
+0

@PP, tout d'abord je m'excuse de ma question .. Je n'ai pas compris votre point .. S'il vous plaît expliquer. – Siddiqui

+0

Il signifie que vous auriez dû fournir plus d'informations: en particulier, le message d'erreur que vous obtenez de l'éditeur de liens. Il suggère aussi que vous fournissiez un exemple compilable complet pour que nous puissions le reproduire, mais je ne suis pas sûr que ce soit toujours nécessaire. – Rup

+0

@Arman, excuses, je crois parfois dur. C'était, en particulier, l'erreur de lien que je cherchais. Vous avez eu de la chance car votre problème est commun et la plupart d'entre nous peuvent déterminer la solution immédiatement. Mais 9 fois sur 10 ce n'est pas le cas - et c'est l'erreur spécifique renvoyée par le programme en question qui aidera les autres à résoudre votre problème. –

2

vous devez créer un lien dans la bibliothèque de prise, dans la ligne de commande:

+0

veuillez me donner quelques explications. – Siddiqui

+1

L'ID que vous utilisez (SunStudio) lors de la compilation utilise les options que vous fournissez dans les paramètres du projet ou dans le fichier makefile. Ces options doivent inclure toutes les bibliothèques dont votre programme a besoin; les bibliothèques doivent être liées (statiquement ou dynamiquement) à votre programme exécutable final. Pour lier la bibliothèque de socket, l'option est la suivante -lsocket. – vulkanino

2

Vous devez ajouter au moins -lsocket à votre lien étape, à savoir le lien contre libsocket.so. Je ne sais pas comment faire cela dans l'interface utilisateur SunStudio, cependant - ses projets sont-ils basés sur des fichiers makefile?

La page de manuel est généralement un bon emplacement pour rechercher les bibliothèques requises. dans ce cas, le man page for socket recommande également -lnsl (voir le synopsis) donc cela peut être nécessaire aussi mais je ne me souviens pas que ce soit nécessaire.