2011-01-21 5 views
2

Le fichier makefile est inclus ci-dessous. C'est juste une longue liste de fichiers objets et deux cibles. Le problème semble être que le $ (INC) est ignoré pour la première cible. Par exemple, la sortie commence par "g ++ -c -o main.o main.cpp" au lieu de "g ++ -I/usr/home/jrm/tmp/proteus_beta -c -o main.o main.cpp".Inclure le chemin étant ignoré dans un fichier gnu make

TIA

PROG = proteus 

# list of object files 
OBJS = main.o \ 
dataset.o \ 
genetic_codes.o \ 
likelihood_engine.o \ 
options.o \ 
parsimony.o \ 
parsimony_engine.o \ 
seq.o \ 
site_collection.o \ 
site_pattern.o \ 
tools.o \ 
optare/crs.o \ 
optare/point.o \ 
optare/newton_1d.o \ 
optare/golden_section.o \ 
models/model.o \ 
models/DNA/DNA_model.o \ 
models/DNA/DNA_ssm.o \ 
models/CODON/CODON_model.o \ 
models/CODON/CODON_modelA.o \ 
models/CODON/CODON_modelB.o \ 
models/CODON/CODON_modelC.o \ 
models/CODON/CODON_modelD.o \ 
models/CODON/CODON_M0.o \ 
models/CODON/CODON_M1.o \ 
models/CODON/CODON_M2.o \ 
models/CODON/CODON_M3.o \ 
models/CODON/CODON_M0gtr.o \ 
models/CODON/CODON_FEBC1.o \ 
models/CODON/CODON_FEBC1b.o \ 
models/CODON/FESC/CODON_FESC1.o \ 
models/CODON/CODON_nh/CODON_M0nh1.0 \ 
models/CODON/CODON_nh/CODON_M1nh1.0 \ 
models/CODON/CODON_nh/CODON_M1nh1.0 \ 
models/CODON/CODON_nh/CODON_M3nh1.0 \ 
models/CODON/CODON_nh/CODON_M0nh2.0 \ 
models/CODON/CODON_nh/CODON_MmodelAnh2.0 \ 
matrices/matrix.o \ 
matrices/DNA_matrix.o \ 
matrices/CODON_matrix.o \ 
matrices/AA_matrix.o \ 
matrices/int_matrix.o \ 
matrices/str_matrix.o \ 
matrices/eigen.o \ 
incidere/slice_sampler.o \ 
dendrology/forestry.o \ 
dendrology/node.o \ 
dendrology/DNA_node.o \ 
dendrology/tree.o \ 
alphabetia/alphabet.o \ 
alphabetia/DNA_alphabet.o \ 
alphabetia/CODON_alphabet.o \ 
alphabetia/AA_alphabet.o 

CC = g++ 

INC=-I/home/jrm/tmp/proteus_beta 

.C.o: 
$(CC) $< -c $(INC) 

$(PROG): $(OBJS) 
$(CC) -o [email protected] $(OBJS) -lm 
+0

Veuillez formater votre code la prochaine fois. –

Répondre

5

Selon votre poste, vous avez un fichier nommé main.cpp, pas un fichier nommé main.C. Mais vous fournissez une règle implicite pour la conversion des fichiers .C en .o. Make va compiler main.cpp en utilisant sa règle intégrée pour la compilation .cpp à .o. Vous avez deux options pour faire ce que vous voulez:

(1) Changer votre règle implicite à .cpp.o (et envisager d'utiliser des règles de style nouveau, à savoir %.cpp: %.o)

(2) Déclarez une variable CXXFLAGS (qui est automatiquement inclus dans la compilation règle implicite de Marque C++) telles que les suivantes:

CXXFLAGS = $(INC) 

puis retirez votre .C.o règle implicite.

La deuxième option simplifiera votre fichier makefile et fonctionnera avec les fichiers C++, quelle que soit l'extension.

+0

Toutes les extensions source se terminent par .cpp et .h, mais la règle .C.o semble trouver tous les fichiers .cpp. Je pense que je me souviens qu'il a une signification spéciale (trouve * .c * .cpp et quelques autres). Mais, j'ai suivi votre conseil et suivi la suggestion 2 et maintenant les objets construisent tous. Merci beaucoup. – jrm

0

Vos fichiers source se terminent par .C ou .cpp?

La règle de compilation pour .C.o listes $(INC) après les autres parties de la règle, pas où vous attendez la sortie à venir:

CC = g++ 
INC = -I/home/jrm/tmp/proteus_beta 

.C.o: 
    $(CC) $< -c $(INC) 

Vous devriez voir:

g++ file.C -c -I/home/jrm/tmp/proteus_beta 

Mais il semble soit ignorer complètement votre règle. Vous mentionnez main.cpp; cela ne sera jamais compilé par votre règle.

Donc, est .C un suffixe reconnu? Vos fichiers sources sont-ils des fichiers .C? Courez-vous sur un système de fichiers insensible à la casse? Pourquoi définissez-vous le compilateur C (CC) - vous avez probablement des problèmes de cas avec votre source.

+0

Merci pour votre réponse. Voir mes commentaires ci-dessus. – jrm