2011-04-06 75 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