-1
votes

Makefile Indiffinefin référence pour principal (essayé d'autres messages sur Stackoverflow)

J'ai essayé le conseil sur erreur de fabrication: référence non définie à la principale et http://nuclear.mutantstargoat.com/articles/make/ . J'ai emménagé dans le répertoire mon fabricant de maquillage était à, couru et a eu plusieurs erreurs de référence non définies.:

my répertoire de fichiers ressemble à ceci p> xxx pré>

et voici mon makingfile: P>

# Specify the final target name
EXE := SnakeGame

# Specify the source files
# Effectively list all source files in the current directory
SRC := $(wildcard *.cpp) \
       $(wildcard ../*.cpp)

#From the source file list, get the corresponding object file list
OBJ := $(SRC:.cpp=.o)

# From the object file list, get the dependency file list to handle automatic recompilation
# when a header file is modified
DEP := $(OBJ:.o=.d)

# Specify preprocessor flags (This is a built-in variable)
CPPFLAGS := -I../Include
# Required flags to enable the automatic dependency generation by the compiler
CPPFLAGS += -MMD -MP

# Specify compiler flags (This is a built-in variable)
# Basic Warning Flags
CFLAGS := -Wall -W -pedantic

# Specify linker flags (This is a built-in variable)
LDFLAGS := -L../lib -Llib/sfml/lib -lsfml-graphics -lsfml-window -lsfml-system

#Specify linker libraries (This is a built-in variable)
LDLIBS := -lm

# Tell make that these target are not real files
.PHONY: all clean

# Now the standard primary rule
all: $(EXE)

# How do we make $(EXE) ? Remember the recipe describe the linking phase
$(EXE): $(OBJ)
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

# Let's clean up the mess
clean:
    $(RM) $(EXE) $(OBJ) $(DEP)

# Don't forget to include the dependency files to let make know when to recompile
-include $(DEP)


2 commentaires

Veuillez poster un exemple de reproductible minimal .


cc est un compilateur C et CFLAGS sont des indicateurs pour un compilateur C. Votre code est écrit en C ++, vous devez donc utiliser CXX comme variable pour le compilateur et CXXFLAGS pour les indicateurs du compilateur. En particulier, votre ligne de liaison utilise $ (cc) afin qu'il tente de créer un lien avec le compilateur C, mais qui échoue car votre code est C ++ Code et à l'aide de fonctions de la bibliothèque standard C ++, dont aucune n'est disponible si Vous liez votre programme en tant que programme C.


3 Réponses :


0
votes

Le linker se plaint d'une fonction manquante principale code>.

ici: (.Text + 0x20): référence non définie à `Main ' P>

Où pensez-vous, est une fonction principale? Dans quel fichier? Il a l'air d'utiliser comme ceci: p> xxx pré>

avec les messages d'erreur mis à jour, il semble que la bibliothèque C ++ standard n'est pas liée. Ajouter "-LSTDC ++" à LDFLAGS P>

LDFLAGS := -L../lib -Llib/sfml/lib -lsfml-graphics -lsfml-window -lsfml-system -lstdc++


9 commentaires

Est-ce un problème avec ma définition SRC?


Le problème pourrait-il être ici: obj: = $ (src: .cpp = .O)? Peut-être à cause des chemins relatifs que vous utilisez?


J'ai changé la définition SRC en "src: = $ (Wildcard version3box / Snake / *. CPP) \ $ (Wildcard version3box / *. CPP)" et le maquillage a commencé à travailler pour 3 lignes, mais je me suis retrouvé littéralement 100 messages de référence indéfinis différents et il a échoué.


Ma fonction principale est dans Main.cpp. Le programme ne compilerait pas sans elle. Cependant, je pensais que le code ci-dessus était censé trouver ma fonction principale.


La compilation sans fonction principale n'est pas un problème (les bibliothèques n'ayant pas de principale). Le lien est, où il se casse. S'il vous plaît montrer les nouveaux messages d'erreur.


J'ai mis à jour mon message avec les nouveaux messages d'erreur lorsque j'exécute le makefile dans le répertoire Version3box / Snake (le répertoire mon fabricant de maquillage est dans)


ressemble à un Lib STD C ++ manquant. Ajouter "-lstdc ++" aux Libs.


Ca ne fonctionne pas. Je vais juste supprimer le poteau et essayer de construire un simple matrice comme tout: Bonjour bonjour: Main.o factoral.o hello.o [onglet] g ++ main.o factorial.o hello.o -o hello.o -o bonjour : Fonctions MAIN.CPP.H [TAB] G ++ -C MAINPPPACT FACTORIAL.O: Factorial.CPP [Tab] g ++ -c factoryial.cppel hello.o: hello.cpp [onglet] g ++ -c hello.cpp propre: [Tab] RM -F * .o quand je découvre comment le faire fonctionner. Je manquais trop tôt.


Peu d'esprit ne supprimera pas. Je vais juste laisser cette abomination pour tout voir. Merci d'avoir essayé d'aider!



0
votes

in cc -l ../ lib -llib / sfml / lib -lsfml-graphiques -lsfml-window -lsfml-system -lm -o snakegame Il n'y a pas de fichier d'objet, donc au moins Le principal est manquant, vous ne pouvez pas simplement donner des libs

in g ++ version3box / snake / MAIN.CPP version3box / box.cppp version3box / serpent / gridpiece.cpp -o Snakegame -llib / sfml / lib -lsfml-graphiques -lsfml-window -lsfml-système -lsfml-système Ce temps il y a un fichier CPP pour produire des objets

Il n'y a pas d'objet dans la première version car, comme le dit Melpomene, les sources ne sont pas trouvées, et elles ne sont pas trouvées parce que vous faites make -f version3box / Snake / Makefile plutôt que ( CD Version3box / Snake /; Make -F Makefile) SO SRC: = $ (Wildcard * .cpp) $ (wildcard ../*. CPP) regarde dans le répertoire actuel plutôt que sous la version3box / Snake comme vous êtes supposé


10 commentaires

Vraisemblablement $ (obj) est vide car $ (src) est vide.


Comment puis-je réparer ça?


@Kalkirin Commencez par créer un exemple de reproductible minimal . En outre, pourquoi avez-vous un makefile dans un sous-répertoire au lieu du niveau supérieur de votre projet?


@Kalcirin comme je le dis dans la version modifiée de ma réponse, entrez dans le répertoire avant de faire la marque. S'il vous plaît mettre à jour et relire ma réponse


Quand i cd version3box / serpent; Make -F Makefile ... Je ne reçois plus une référence indéfinie à la principale, mais je me fais souffler avec 50 - 100 nouvelles erreurs de référence non définies aux fonctions.


Melpomene - Je n'ai absolument aucune idée de la façon dont les fabricants travaillent au guichet automatique. Je peux juste faire d'incroyablement simples. Mais ce projet va devenir assez complexe, alors j'ai besoin de meilleurs fabricants


Le makefile est étrange, recherchant dans le répertoire actuel et dans le répertoire parent. Il est préférable d'avoir un makefile dans chaque répertoire, de faire des libs, sauf dans le répertoire où le principal est et produisant l'EXE en utilisant également les autres libs


Avec les informations que nous avons (vous donnez) il est difficile de vous aider davantage, au moins vous savez pourquoi vous avez l'erreur de la manquante principale


Je n'ai absolument aucune idée de la façon de faire cela et n'a pas trouvé de tutoriel m'approuvoir comment faire cela pour le moment. J'ai mis à jour mon message avec de nouveaux messages d'erreur


@Kalkirin, vous devez faire la marque et regarder ce qui est fait et ce qui manque à atteindre le but, encore une fois, nous n'avons rien à dire "faire ça et tout ira bien" sauf ce que j'ai dit dans la réponse



0
votes

Je continuerai à éditer cette réponse comme je trouve le problème. Je vais étudier le manuel GNU ( https: //www.gnu .org / logiciel / make / manuel / make.html # Récursion ) Pour déterminer ce problème.

Edit: Voici le filet de travail qui compile et exécute mon programme P>

# Specify the final target name
EXE := SnakeGame

# Specify the paths for make to search and find files
vpath %.h Version3Box/SharedHeaders:Version3Box/Snake/Headers
vpath %.cpp Version3Box/SharedCppFiles:Version3Box/Snake/CppFiles

# Specify preprocessor flags (This is a built-in variable)
CPPFLAGS := -I../Include
# Required flags to enable the automatic dependency generation by the compiler
CPPFLAGS += -MMD -MP

# Specify compiler flags (This is a built-in variable)
# Basic Warning Flags
CXXFLAGS := -Wall -W -pedantic

# Specify linker flags (This is a built-in variable)
LDFLAGS := -L../lib -lstdc++ -Llib/sfml/lib -lsfml-graphics -lsfml-window -lsfml-system

#Specify linker libraries (This is a built-in variable)
LDLIBS := -lm

# Specify all of the objects used in compilation and infer recipes
objects = main.o Box.o GridPiece.o

# The compiling rule
SnakeGame : $(objects)
    $(CXX) $(CXXFLAGS) -o $(EXE) $(objects) $(LDFLAGS) $(LDLIBS)

# Dependency of each file
$(objects) : Box.h
main.o GridPiece.o : GridPiece.h

# Remove each intermediate file generated
.PHONY : clean
clean :
    rm $(objects) *.d


0 commentaires