2011-04-06 33 views
0

我在我的src目录下生成文件。 生成文件应建立数据结构,这是在数据结构/,然后遍历所有cpp文件中的计算/并创建../bin/calculations相应的.so文件写makefile来构建动态库

我试过的语法如下:

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 2011-04-06 12:01:41

回答

2

您需要在all:目标中明确指定先决条件。

在生成文件的说法,%是可以在自动规则中使用的通配符。但是,all:目标是一个没有此类通配符的简单目标,因此${BIN}${COMPS}%.so在该上下文中是错误的。

请注意,当我在此上下文中说'通配符'时,此通配符将匹配目标与先决条件,而不是针对文件系统,如glob表达式中的*


而且,当你的HART是在正确的地方,作为一个风格问题,你的Makefile可以更好:

  • 中介的对象,不应该是all目标的先决条件,但只您希望运送的最终目标。
  • 有自动和简单的规则组合,以指定对象的创建。
  • 典型地,一个不写的自动规则%.so,因为一个库通常由多个对象构成。
  • 对象和头文件之间的依赖关系是一个复杂的问题。总之,你需要指定生成的对象依赖于*.cpp(或.c)以及所有的标题包括:(直接和间接)由*.cpp文件。
  • 按照惯例,深受GNU支持制作,而是采用${COMPILE}为你做什么,应该使用您希望传递给编译器的标准标志$(CXX)为你的C++编译器和$(CXXFLAGS)
1

你需要像

 
SOBJECTS = ... 

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

您需要一种方法来收集所有的变量SOBJECTS的*。所以名字。您可以手动执行此操作,或使用make的某些内部函数来扫描源目录。

还要注意,我删除这两个文件*.oall目标相关性。他们不是最终的目标(我认为),所以你不需要在那里提及它们。

除此之外还有其他的风格点,我会采取不同的方式,但目前他们不会造成直接问题,所以我不会离题,但我建议你看看一些教程,看看事情如何一般完成。
对于初学者,请看Paul's Rules of MakefilesHow Not to Use VPATH