我是Automake的新手,我试图在没有链接的情况下进行编译。我的目标是使用Automake生成一个简单的Makefile,如下所示。
CFLAG = -Wall
build: Thread.o
Thread.o: Thread.cc Thread.h
g++ $(CFLAG) -c Thread.cc
clean:
rm -f *.o
到目前为止,我的尝试将我带到了以下的Makefile.ac。
noinst_PROGRAMS = thread
thread_SOURCES = Thread.cc
EXTRA_DIST= Thread.h
如何模拟我的原始Makefile?
答案 0 :(得分:2)
这样做的一种方法是通过提供不链接的链接命令来欺骗Automake:
thread_LINK = true
除此之外,如果Automake没有这样的功能,我不会感到惊讶。
答案 1 :(得分:2)
对于您的示例,您可以直接要求Automake构建您的.o
文件,例如 :
$ make Thread.o
我相信这是一个隐式规则,所以你不会在输出Makefile中看到它。
通常,Automake会生成包含所有每个可执行文件或库目标所需对象的变量。在Makefile
中使用它们非常简单,因为它只是通过将_OBJECTS附加到目标名称来生成它们的名称。您可以像Makefile.am
这样制作自己的目标:
build-thread: $(thread_OBJECTS)
然后你可以像这样构建Thread.o(以及thread
所需的任何其他对象):
$ make build-thread
如果您有多个目标foo
,bar
和baz
,则可以在Makefile.am
中创建仅限编译目标:
build: $(foo_OBJECTS) $(bar_OBJECTS) $(baz_OBJECTS)
唯一的痛苦是,您需要根据Makefile.am
中的目标自行维护此列表。您可以在命令行中调用它,如下所示:
$ make build
答案 2 :(得分:2)
Automake不是为了生成对象而设计的。它将构建程序或库。 如果不知道为什么要编译单个目标文件而不是其他东西,很难回答你的问题。也许对你的“真实”问题有一个更清晰的答案。
你能写的Makefile.am
是
noinst_LIBRARIES = libThread.a
libThread_a_SOURCES = Thread.cc Thread.h # No need to put headers in EXTRA_DIST
生成的Makefile
将构建仅包含libThread.a
的库libThread.o
,因为*.a
库只是对象文件的集合,所以不涉及链接。
上述Makefile.am
还会导致发出的Makefile
包含编译libThread.o
的规则,因此您可以根据需要添加build:
规则。
如果您真的希望Automake发出此编译规则,但不构建库,则可以使用
EXTRA_LIBRARIES = libThread.a # EXTRA here means "output build rules but don't
# build unless something depends on it".
libThread_a_SOURCES = Thread.cc Thread.h
build: Thread.$(OBJEXT)
现在,您只需在键入Thread.$(OBJEXT)
时明确要求生成文件make build
,就像在原始Makefile
中一样。
(Automake使用.$(OBJEXT)
而不是.o
来支持DOS变体中的.obj
等扩展。)
答案 3 :(得分:0)
首先,automake是一个自动制作Makefile的工具;让它本身就是一个完全不同的野兽(我很确定你所寻找的是一个制造解决方案)。
这是最简单的基于GNU的Makefile,可以实现您的目标:
all: Thread.o
这会填写一些内容(默认情况下),如下所示(请将4个空格的空格更改为硬标签):
all: Thread.o
Thread.o: Thread.cc
$(COMPILE.cpp) $(OUTPUT_OPTION) $<
COMPILE.cpp和OUTPUT_OPTION宏当然默认扩展为GNU make指定值并且不可移植; $&LT;是AT&amp; T虽然根据pmake(1)的手册页制作了标准语法。
GNU make有一个隐式vs显式规则,模式,后缀等概念,你可以使用,但这不能移植到所有版本的make,因此这就是为什么所有的Makefile都是根据目标明确拼写出来的原因和变量POSIX没有描述人们应该如何编写Makefile的许多所需场景。
运行gmake -p以获取更多详细信息,并在隐式,显式规则,模式,后缀等主题中查看gmake的texinfo手册。