2011-04-06 5 views
0

src 디렉토리에 makefile이 있습니다. 메이크는 ../bin/calculations에 해당하는 .so 파일을 데이터 구조체 /에있는 데이터 구조를 구축 한 다음 계산에 모든 CPP 파일을 반복/및 작성해야 동적 라이브러리를 빌드하기위한 메이크 파일 작성

나는 다음과 같은 구문을 시도 :

DAST = DataStructures/ 
COMPS = computations/ 
BIN = ../bin/ 
OBJECTS = ${DAST}Atom.o ${DAST}Molecule.o 
COMPILE = g++ -Wall -g -c -std=c++0x -I/usr/local/include/openbabel-2.0 LINK = g++ -Wall -g -std=c++0x ${OBJECTS} -lopenbabel -I/usr/local/include/openbabel-2.0 

all: ${BIN}main ${DAST}Molecule.o ${DAST}Atom.o ${BIN}${COMPS}%.so 

${BIN}main: ${OBJECTS} main.cpp 
    ${LINK} main.cpp -o ${BIN}main 

${DAST}Molecule.o: ${DAST}Molecule.h ${DAST}Molecule.cpp  
    ${COMPILE} ${DAST}Molecule.cpp -o ${DAST}Molecule.o 

${DAST}Atom.o: ${DAST}Atom.h ${DAST}Atom.cpp 
    ${COMPILE} ${DAST}Atom.cpp -o ${DAST}Atom.o 

${BIN}${COMPS}%.o: ${COMPS}%.cpp 
    gcc -Wall -fPIC -c -lopenbabel $< -I/usr/local/include/openbabel-2.0 -std=c++0x 

${BIN}${COMPS}%.so: ${COMPS}%.o 
    gcc -shared -Wl,-soname,libcsmtest.so.1 -o libcsmtest.so [email protected] 

clean: 
    rm -rf ${OBJECTS} 

.PHONY: all clean 

하지만 분명히 나는 ​​다음과 같은 출력을 얻을로, 작동하지 않습니다

[email protected]:~/csm/csm2/src$ make all 
make: *** No rule to make target `../bin/computations/%.so', needed by 'all'. Stop. 

감사

+1

나는 Make를 사용하지 않으므로 귀하의 질문에 대한 답변이 아닙니다. 그러나 CMake 또는 Bjam과 같은 크로스 플랫폼 빌더를 사용하는 방법을 배우는 것이 투자 가치가 있다고 제안합니다. 일반적으로 구문 적으로 더 쉽고 설치 및 유지 관리가 쉬우 며 Linux 및 Windows 환경에서 모두 작동합니다. – Tom

답변

2

당신은 필요 all: 대상에서 필수 조건을 명시 적으로 지정하십시오.

Makefile 용어에서 %는 자동 규칙에서 사용할 수있는 와일드 카드입니다. 그러나 all: 대상은 와일드 카드가없는 간단한 대상이므로 ${BIN}${COMPS}%.so은 그 상황에서 잘못되었습니다.

이 컨텍스트에서 '와일드 카드'라고 말하면,이 와일드 카드는 글로브 표현에서 *과 같은 파일 시스템이 아니라 필수 조건과 대상을 일치시킵니다. 당신의 하트 스타일의 문제로, 바로 이곳에있는 동안


또한, 당신의 메이크 더 좋을 수 있습니다

  • 중개 객체는 all 대상의 전제 조건이 될,하지만 안 최종 목표물.
  • 개체 생성을 지정하는 자동 규칙과 단순 규칙이 혼합되어 있습니다. 도서관은 종종 하나 이상의 객체로 구성되어 있기 때문에
  • 일반적으로 하나 %.so에 대한 자동 규칙을 작성하지 않습니다.
  • 개체와 헤더 파일 간의 종속성은 복잡한 문제입니다. 모든 헤더가 *.cpp 파일에 의해 (직접 및 간접적으로) 포함으로 한마디로 당신은뿐만 아니라 결과 객체가 *.cpp (또는 .c)에 의존한다는 것을 지정해야합니다.
  • 보통은 GNU make에서 잘 지원되지만 ${COMPILE}을 사용하는 대신 C++ 컴파일러에는 $(CXX)을 사용하고 해당 컴파일러에 전달하려는 표준 플래그에는 $(CXXFLAGS)을 사용해야합니다.
1

당신은 당신은 변수 SOBJECTS에있는 모든 * .so를 이름을 수집하는 방법이 필요합니다

 
SOBJECTS = ... 

all: ${BIN}main ${SOBJECTS} 
    ... 

뭔가를해야합니다. 이 작업을 수동으로 수행하거나 make의 내부 기능 중 일부를 사용하여 소스 디렉토리를 스캔 할 수 있습니다.

두 개의 *.o 파일을 all 대상의 종속 파일로 제거했습니다. 그것들은 빌드의 최종 목표가 아니기 때문에 거기에 언급 할 필요가 없습니다.

이 외에도 제가 다르게 할 수있는 다른 스타일 포인트가 있지만 지금 당장은 문제를 일으키지 않으므로 나는 빗나가지 않을 것입니다.하지만 자습서를보고 일반적으로 수행됩니다.
처음에는 Paul's Rules of MakefilesHow Not to Use VPATH을 확인하십시오.