Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Makefile异常:调用'make',它似乎正在运行另一个Makefile_Linux_Makefile_Gnu - Fatal编程技术网

Linux Makefile异常:调用'make',它似乎正在运行另一个Makefile

Linux Makefile异常:调用'make',它似乎正在运行另一个Makefile,linux,makefile,gnu,Linux,Makefile,Gnu,我有以下生成文件: OBJDIRS = Runtime/Core/Common Runtime/Core/Graphic/SymbolXLib Runtime/Core/Map Runtime/Core/SymbolDictionary \ Runtime/CoreClient/RuntimeCoreJava OBJS = $(wildcard $(OBJDIRS:=/*.o)) TARGETA = libRuntimeC

我有以下生成文件:

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无关的另一个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将检查它们是否已过期,是否应重新生成。如果它检查一个对象文件,找到一个更新的对应源文件,尝试重新编译该对象,并且缺少一个头文件,您将得到一条错误消息,如您所看到的。没有证据表明另一个makefile在起作用

有几种方法可以解决这个问题。最简单的方法可能是将源文件从运行Make的目录移开(反之亦然)

编辑:

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

如果使用
make-f./Makefile
会发生什么,以确保它使用的是正确的规则?同样的情况也会发生,只有当我删除行OBJS=$(通配符$(OBJDIRS:=/*.o))时,wierd编译才会消失。有没有我丢失的国旗。或者对象文件是否需要重新编译?如果我删除通配符并用单个对象文件替换它,它运行得很好。你是说OBJS是绝对路径吗?似乎
$(OBJDIRS:=./*.o)
可能是您真正想要的。@blahdiblah:这是一个很好的观点,因为GNU make会在任何
生成文件
生成文件
之前获取
GNUmakefile
…在我的生成文件中的什么时候尝试重建源代码?如您所见,我没有注释编译行?@MatthewHoggan:Make使用内置的模式规则。您可以使用
-r
开关禁用它们。有没有办法关闭该功能?@MatthewHoggan在
$(TARGETD):$(OBJS)
行中。其中一个
OBJS
Runtime/Core/Common/JNICallback.o
。检查它是否能够并且应该重建它。Make对
%.o:%.cpp
有一个隐式规则,它找到一个匹配的
JNICallback.cpp
。您已经注释掉了规则中的一些命令,这一事实没有任何区别。@eriktous哦,太好了!我不知道那个。