2013-03-25 75 views
0

我正在使用makefile來製作一個目標。 這裏我很困惑makefile是如何從.cpp文件生成.o文件的。makefile隱式規則 - 困惑

與文件clientthread_level1_unix.o一樣,必須從clientthread_level1_unix.cpp文件生成。 但是沒有指定使用* .cpp文件的地方。

EXTRALIBS = -pthread -lz -ldl -lm 
OPENGLLIBS = 
LDFLAGS_GL = 
LDLIBS = ${APPEXTRALIBS} ${top_builddir}/lib/libwx_based-2.6.a ${EXTRALIBS} 

# Compiler used 
CXX   = c++ 
CC   = gcc 

CANALOBJS =  ../../common/listenthread_unix.o ../../common/clientthread_level1_unix.o ../../common/devicethread_unix.o \ 
     ../../common/canalshmem_level1_unix.o ../../common/clientlist.o ../../common/controlobject.o \ 
     ../../common/devicelist.o ../../common/udpreceivethread_unix.o ../../../vscp/common/vscp.o \ 
     ../../common/clientthread_level2_unix.o ../../common/canalshmem_level2_unix.o \ 
     ../../common/tcplistenthread.o 
CANALHDRS = ../../common/clientlist.h ../../common/controlobject.h ../../common/devicelist.h \ 
     ../../common/canal.h ../../common/canaldlldef.h \ 
     ../../common/version.h ../../common/canal_unix_ipc.h ../../common/CanalShMem_level1_unix.h \ 
     ../../common/CanalShMem_level2_unix.h ../../common/clientthread_level1_unix.h ../../common/clientthread_level2_unix.h 
PROJOBJS = ../../../common/dllist.o ../../../common/configfile.o ../../../common/crc.o 
PROJHDRS = ../../../common/dllist.h ../../../common/configfile.h 
OBJS  = canald.o 
HDRS  = canald.h 


all:  canald 

# Build the Linux executable 
canald:  $(OBJS) $(HDRS) $(CANALOBJS) $(CANALHDR) $(PROJOBJS) $(PROJHDRS) 
     $(CXX) $(OBJS) $(CANALOBJS) $(PROJOBJS) -o canald $(LIBS) $(LDLIBS) 

如果我們使用隱含規則,然後也,則也canald目標不是按那個。 http://www.gnu.org/software/make/manual/make.html#make-Deduces http://www.gnu.org/software/make/manual/make.html#Implicit-Rules

請sugest這條線是如何工作的,產生canald

$(CXX) $(OBJS) $(CANALOBJS) $(PROJOBJS) -o canald $(LIBS) $(LDLIBS) 

回答

0

$(CXX) $(OBJS) $(CANALOBJS) $(PROJOBJS) -o canald $(LIBS) $(LDLIBS) 

將大約(I跳過沒有定義的變量)被翻譯成:

c++ canald.o ../../common/listenthread_unix.o ../../common/clientthread_level1_unix.o ../../common/devicethread_unix.o \ 
    ../../common/canalshmem_level1_unix.o ../../common/clientlist.o ../../common/controlobject.o \ 
    ../../common/devicelist.o ../../common/udpreceivethread_unix.o ../../../vscp/common/vscp.o \ 
    ../../common/clientthread_level2_unix.o ../../common/canalshmem_level2_unix.o \ 
    ../../common/tcplistenthread.o \ 
    ../../../common/dllist.o ../../../common/configfile.o ../../../common/crc.o \ 
    -o canald /lib/libwx_based-2.6.a -pthread -lz -ldl -lm 

即, 「正常」 的編譯器調用。由於canald有明確的規則,因此不需要搜索含義不明確的規則。另外,它是Makefile中的目標規則,因此它是默認目標。

Howerver,對於對象canald依賴於,不存在明確的規則,因此使用隱式規則。

如果您想知道哪些隱式規則存在,請致電make -p並在輸出中搜索該模式,例如,在你的情況下爲%.cpp

+0

所以你的意思是說make會自動爲現有的makefile應用像%.cpp這樣的隱式規則----或者我必須手動應用它。 – Katoch 2013-03-25 08:45:35

+0

這是「隱式」規則的概念,不需要明確應用。除了主要目標之外,「make」總是自動推斷應用哪些規則。因此,您可以將規則寫入您的'Makefiles'中,永遠不會應用(因爲不需要這樣做)。 – Matthias 2013-03-25 08:53:14

+0

謝謝,我得到的是make將自己應用這個隱式規則,並且沒有必要明確指定它。對 ? – Katoch 2013-03-25 10:58:16