【发布时间】: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 会在任何
makefile或Makefile之前选择GNUmakefile...