La liaison d'erreur: Undefined reference to fonctions qui sont définies dans un fichier séparé?
Je suis probablement oublié quelque chose d'évident qui va résoudre ce problème. Alors qu'il y a d'autres questions sur DONC avec le même problème, aucune des solutions ont été applicable à ma situation.
J'ai un fichier principal, sim.c, un fichier d'en-tête net.h, un fichier d'en-tête de vos amis.h et un fichier avec les fonctions, net.c. J'ai un makefile, que j'ai créé avec gmakemake > fichier Makefile, et son contenu sont très basiques.
En-tête.mak (makefile modèle):
CFLAGS = -Wall -Wextra -pedantic -std=c99 -ggdb
LFLAGS = -ggdb
LDFLAGS =
Makefile contenu pertinent:
CPP_FILES =
C_FILES = net.c sim.c
PS_FILES =
S_FILES =
H_FILES = net.h friends.h
SOURCEFILES = $(H_FILES) $(CPP_FILES) $(C_FILES) $(S_FILES)
.PRECIOUS: $(SOURCEFILES)
OBJFILES =
#
# Main targets
#
all: net sim
net: net.o $(OBJFILES)
$(CC) $(CFLAGS) -o net net.o $(OBJFILES) $(CLIBFLAGS)
sim: sim.o $(OBJFILES)
$(CC) $(CFLAGS) -o sim sim.o $(OBJFILES) $(CLIBFLAGS)
#
# Dependencies
#
net.o: net.h
sim.o: net.h
Ma carte sim.c fichier contient:
#include "net.h"
#include "friends.h"
Mon fichier d'en-tête contient les fonctions dans le filet.c et définit tout comme les talons. J'ai copié et collé à la création de la fonction en-têtes, donc il ne devrait pas y avoir de fautes de frappe.
Mon net.c fichier contient:
#include "net.h"
Pourtant, chaque fois qu'une fonction de la carte sim.c tente d'appeler une fonction dans le filet.c, il erreurs sur cette ligne avec:
"undefined reference to `function_name`".
Comment puis-je faire sim.c pouvoir accéder aux fonctions du net.c?
Vous devez vous connecter pour publier un commentaire.
Le message
undefined reference to 'function_name'
implique que tous les fichiers de l'objet que vous donnez à l'éditeur de liens, aucun d'entre eux a une définition pourfunction_name
. Cela signifie que soitfunction_name
-- par "compilé", je veux dire avec toutes les différentes options de préprocesseur vous utilisez sur elle.Puisque vous montrer ni à votre ligne de commande de liaison, ni le contenu de
net.c
, nous ne pouvons pas dire qui est le problème.modifier
avec votre montage, nous pouvons voir clairement que vous avez le premier problème: lorsque vous essayez de lier
sim
, vous n'incluent pasnet.o
sur la ligne de commande de liaison. Plus couramment, vous devez liersim
avec un makefile entrée comme:ou plus simplement:
en s'appuyant sur la valeur par défaut qui font des actions pour lier les fichiers objet
Pour les deux fonctions de "voir" les uns les autres, assurez-vous que:
Qui devrait le faire, sauf si vous utilisez un très vieux complier avec encore plus mal de choses qui peuvent aller mal 😉