2013-03-25 3 views
0

Я работаю над проектом, в котором makefile используется для создания цели. Здесь я запутался, как makefile генерирует файлы .o из файла .cpp.makefile неявное правило - confused

Как файл 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) 

будет приблизительно (я пропустил не определены переменные) быть переведены на:

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 автоматически применит неявное правило, например,% .cpp для существующего makefile ---- или я должен применить его вручную. – Katoch

+0

Это идея «неявных» правил, что нет необходимости применять явно. Более того, за исключением основной цели, 'make' всегда выводит автоматически, какие правила применять. Таким образом, вы можете писать правила в свои «Makefiles», которые никогда не будут применяться (потому что это не нужно делать). – Matthias

+0

Спасибо, что я получил, будет применять это неявное правило самостоятельно, и нет необходимости указывать его явно. правильно ? – Katoch

Смежные вопросы