【问题标题】:Makefile Anomaly: Invoke `make` and it appears to be running another makefileMakefile 异常:调用“make”,它似乎正在运行另一个 makefile
【发布时间】:2012-03-06 23:54:30
【问题描述】:

我有以下 Makefile:

OBJDIRS       = Runtime/Core/Common Runtime/Core/Graphic/SymbolXLib Runtime/Core/Map Runtime/Core/SymbolDictionary \
                Runtime/CoreClient/RuntimeCoreJava
OBJS          = $(wildcard $(OBJDIRS:=/*.o))
TARGETA       = libRuntimeCoreJava.a
TARGETD       = libRuntimeCoreJava.so
TARGETD1      = $(TARGETD).1
TARGETD2      = $(TARGETD).1.0
TARGETD3      = $(TARGETD).1.0.0
AR            = ar cqs
LINK          = g++
SYMLINK       = ln -f -s
LDFLAGS = -shared -Wl,-soname,libRuntimeCoreJava.so.1

all : $(TARGETD) $(TARGETA)

$(TARGETD) : $(OBJS)
        echo "Building Dynamic Lib using "$(OBJS)
        #$(CXX) $(LDFLAGS) $(OBJS)
        #$(SYMLINK) $(TARGETD) $(TARGETD1)
        #$(SYMLINK) $(TARGETD) $(TARGETD2)
        #$(SYMLINK) $(TARGETD) $(TARGETD3)

$(TARGETA) : $(OBJS)
        echo "Building Static Lib using "$(OBJS)
        #$(AR) $(TARGETA) $(OBJS)

当我在与 Makefile 相同的级别运行 make 时,它​​似乎调用了另一个与此无关的 makefile。

In file included from Runtime/Core/Common/JNICallback.cpp:16:
Runtime/Core/Common/stdafx.h:33:17: error: log.h: No such file or directory
Runtime/Core/Common/stdafx.h:34:23: error: Namespace.h: No such file or directory
Runtime/Core/Common/JNICallback.cpp:18:25: error: JNICallback.h: No such file or directory
make: *** [Runtime/Core/Common/JNICallback.o] Error 1

如您所见,我什至没有构建任何源代码,只获取已经编译的目标文件并将它们放入静态和动态库中。为什么要编译源代码?下面是我的目录结构。

[matt6809@hogganz400 src]$ ls -l
drwxrwxr-x  2 matt6809 matt6809  4096 Mar  2 11:47 binDebug
drwxrwxr-x  2 matt6809 matt6809  4096 Feb 15 13:31 binRelease
drwxrwxr-x  2 matt6809 matt6809  4096 Feb 22 11:03 include
drwxrwxr-x  2 matt6809 matt6809  4096 Mar  5 10:55 libDebug
drwxrwxr-x  2 matt6809 matt6809  4096 Feb 15 11:25 libRelease
-rw-rw-r--  1 matt6809 matt6809   824 Mar  6 15:48 Makefile
drwxrwxr-x  5 matt6809 matt6809  4096 Feb 14 16:03 Runtime
drwxrwxr-x  6 matt6809 matt6809  4096 Feb 14 16:43 System

我 100% 确定我与 makefile 位于同一目录中。什么给了?

【问题讨论】:

  • 如果您执行make -f ./Makefile 以更加确定它使用的是正确的会发生什么?
  • 同样的事情发生了,唯一一次奇怪的编译消失是当我删除 OBJS = $(wildcard $(OBJDIRS:=/*.o)) 行时。有没有我失踪的标志。或者目标文件是否需要重新编译?如果我删除通配符并用单个对象文件替换它,它运行得很好。
  • 您的意思是让 OBJS 成为绝对路径吗?看起来$(OBJDIRS:=./*.o) 可能是您真正想要的。
  • @blahdiblah:非常好的一点,因为 GNU make 会在任何 makefileMakefile 之前选择 GNUmakefile ...

标签: linux makefile gnu


【解决方案1】:

您的目标将目标文件作为先决条件(无论目标文件当时恰好在这些目录中)。目标文件已经存在,但 Make 会检查它们以查看它们是否过时并且应该重新构建。如果它检查一个目标文件,找到一个相应的更新源文件,尝试重新编译该对象并且缺少一个头文件,您将收到一条错误消息,就像您看到的那样。没有证据表明另一个 makefile 正在运行。

有几种方法可以处理它。 最简单的方法可能是将源文件从运行 Make 的目录中移开(反之亦然)。

编辑:
@eriktous 指出了一种更好的方法:使用 make -r 禁用内置规则。

【讨论】:

  • 在我的 Makefile 中的什么时候会尝试重建源代码?如您所见,我没有注释编译行?
  • @MatthewHoggan:Make 使用内置的模式规则。您可以使用-r 开关禁用它们。
  • 有没有办法关闭该功能?
  • @MatthewHoggan 在$(TARGETD) : $(OBJS) 行中。 OBJS 之一是 Runtime/Core/Common/JNICallback.o。检查它是否可以并且应该重建它。 Make 对%.o: %.cpp 有一个隐式规则,它会找到匹配的JNICallback.cpp。您在 your 规则中注释掉了一些命令这一事实没有任何区别。
  • @eriktous 哦,太好了!我不知道那个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多