0

makefileを使用してターゲットを作成するプロジェクトに取り組んでいます。ここで、makefileが.cppファイルから.oファイルを生成する方法がわかりません。

ファイルのように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)

暗黙のルールを使用する場合も、カナルドターゲットはそれとは異なります。 http://www.gnu.org/software/make/manual/make.html#make-Deduces http://www.gnu.org/software/make/manual/make.html#Implicit-Rules

このラインがカナルドを生産するためにどのように機能しているかを推測してください。

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

1 に答える 1

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ため、デフォルトのターゲットになります。

ただし、オブジェクトの場合canaldは、明示的なルールが存在しないため、暗黙的なルールが使用されます。

どの暗黙のルールが存在するかを知りたい場合make -pは、出力でパターンを呼び出して検索します。たとえば、の場合は%.cpp

于 2013-03-25T08:35:48.297 に答える