【问题标题】:makefile implicit rule -- confusedmakefile 隐式规则——困惑
【发布时间】:2013-03-25 05:45:26
【问题描述】:

我正在开发一个使用 makefile 来制作目标的项目。 在这里,我很困惑 makefile 如何从 .cpp 文件生成 .o 文件。

like 文件 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

请问这条生产线是如何生产canald的?

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

【问题讨论】:

    标签: gcc makefile


    【解决方案1】:

    线

     $(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

    【讨论】:

    • 所以你的意思是说make会自动为现有的makefile应用像%.cpp这样的隐式规则----或者我必须手动应用它。
    • 这是“隐式”规则的思想,不需要显式应用。更重要的是,除了主要目标之外,make 总是自动推断要应用哪些规则。因此,您可以将永远不会应用的规则写入您的 Makefiles(因为没有必要这样做)。
    • 谢谢,我得到的是 make 将自己应用这个隐式规则,不需要明确指定它。对吗?
    • @Katoch:只要隐式规则符合您的要求,就无需重新定义它。规则的应用程序始终遵循目标依赖关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    相关资源
    最近更新 更多