2011-01-21 2 views
2

makefile은 아래에 포함되어 있습니다. 그것은 단지 객체 파일과 두 개의 타겟의 긴리스트 일뿐입니다. 문제는 $ (INC)가 첫 번째 타겟에서 무시되고있는 것으로 보입니다. 예를 들어, 출력은 "g ++ -I/usr/home/jrm/tmp/proteus_beta -c -o main.o main.cpp"대신 "g ++ -c -o main.o main.cpp"로 시작합니다. 게시물에 따르면 TIAgnu make 파일에 포함되는 경로를 포함하지 않음

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

다음에 코드를 포맷하십시오. –

답변

5

, 당신은 main.cpp라는 이름의 파일이 아닌 main.C라는 이름의 파일이 있습니다. 그러나 .C 파일을 .o으로 변환하는 암시 적 규칙을 제공합니다. 컴파일은 .cpp ~ .o 컴파일을위한 내장 규칙을 사용하여 main.cpp을 컴파일합니다. 이는 자동적으로 (

이 이

(2) CXXFLAGS 변수를 선언

(1) .cpp.o에 묵시적 규칙을 변경 (새로운 스타일의 규칙을 사용하는 것이 좋습니다 즉 %.cpp: %.o) : 당신은 당신이 원하는 일을하는 두 가지 옵션이 있습니다

CXXFLAGS = $(INC) 

을 다음 .C.o 암시 적 규칙을 제거 : 다음과 같은) 만들기의 C++ 컴파일 묵시적 규칙에 포함되어 있습니다.

두 번째 옵션은 메이크 파일을 단순화하고 확장명에 관계없이 C++ 파일에서 작동합니다.

+0

모든 소스 확장자는 .cpp와 .h로 끝나지만 .C.o 규칙은 .cpp 파일을 모두 찾은 것 같습니다. 나는 그것이 특별한 의미를 가졌다 고 생각한다. (* .c * .cpp와 다른 것들을 발견한다.) 그러나 저는 여러분의 충고를 받아들이고 제안 2를 따랐습니다. 이제 모든 사물들이 만들어집니다. 고맙습니다. – jrm

0

.C 또는 .cpp으로 소스 파일을 끝내시겠습니까?

당신은 출력이 올 것으로 예상 어디

.C.o 목록 규칙의 다른 부분 후 $(INC)에 대한 컴파일 규칙은 없습니다 :

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

를하지만에 나타납니다

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

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

당신은 볼 수 너의 통치를 모두 무시하라. 너는 main.cpp을 언급한다; 그것은 당신의 규칙에 의해 컴파일되지 않습니다.

따라서 .C은 인식 된 접미사입니까? 당신의 소스 파일은 .C 파일입니까? 대소 문자를 구별하지 않는 파일 시스템에서 실행하고 있습니까? 왜 C 컴파일러 (CC)를 설정하고 있습니까? 소스에 문제가있을 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 위의 내 의견을 참조하십시오. – jrm