2017-06-05 1 views
-1

Ce que je besoin d'aide: Passing une valeur entière qui est en fichier2.c à file3.c via variable globale en utilisant file1.hComment implémenter une variable globale?

Bonjour, J'ai un problème en utilisant une variable globale pour identifier l'un des les ports que j'utilise sur un projet de texte chiffré. C'est assez gros, donc je viens d'ajouter les extraits de code qui traitent de mon problème.

Ce que je suis actuellement en utilisant pour compiler: gcc -o executable3 fichier2.c file1.h (cela fonctionne)

et ma deuxième ligne (ne fonctionne pas): gcc -o executable3 file3.c

mon message d'erreur lors de la compilation: undefined reference to `variable globale » collect2: ld retourné 1 état de sortie

mon fichier file1.h:

ifndef FILE1_H 
define FILE1_H 
include <stdio.h> 
include <stdlib.h> 
extern int *GLOBALVARIABLE; 
endif 

Mon fichier où j'initialiser la valeur variable globale et mettez-égal au numéro de port (fichier 2):

#include "file1.h" 
#define SIZE 128000 
int *GLOBALVARIABLE; 
int main(int argc, char *argv[]) 
{ 
int sockfd, newsockfd, portno; 

portno = atoi(argv[1]); 
GLOBALVARIABLE = &portno; 

fichier qui provoque la compilation conflit indiqué ci-dessus (fichier 3):

#include "file1.h" 
#define SIZE 16000 
int main(int argc, char *argv[]) 
{ 
int sockfd, portno; 
portno = atoi(argv[3]); 
if (portno == *GLOBALVARIABLE){ 
printf("Theres been a port error, you are using the wrong port for this 
command"); 
exit(1); 

S'il vous plaît aider ! Merci!

+0

Vous avez deux fonctions principales() une dans le fichier 2 et le fichier 3, cela signifie qu'il va créer deux exécutables?N'est-ce pas que vous voulez avoir seulement un exécutable? – LethalProgrammer

Répondre

1

Vous utilisez votre compilateur dans le mauvais sens. Par défaut, gcc émet un binaire exécutable, ce qui signifie qu'il effectue déjà l'étape de liaison. Lors de la liaison, tous les symboles (à l'exception de ceux importés d'objets partagés) doivent être définis.

Ce que vous devez faire est compilation uniquement vos fichiers source (option -c) dans des fichiers d'objets, puis lient ces fichiers objet:

gcc -c -ofile2.o file2.c    # <- compile 
gcc -c -ofile3.o file3.c    # <- compile 
gcc -oexecutable file2.o file3.o  # <- link 

Dans la pratique, ajouter des indicateurs permettant des avertissements, chosing un C standard, etc.

modifier: Comme indiqué dans les commentaires, main ne devrait exister une fois. Lequel attendriez-vous d'être exécuté autrement?


Deux autres pensées ici:

  1. Ne jetez pas les fichiers d'en-tête (.h) sur vos lignes de commande du compilateur. Ils sont inclus dans les fichiers source si nécessaire. Si vous souhaitez partager une variable entre deux programmes indépendants, cela n'est pas possible en utilisant extern. Les "variables globales" n'existent que dans le cadre du processus un. Si vous voulez partager des données entre des processus, il y a par exemple. mémoire partagée, tuyaux, etc. (google pour eux).