如何在没有Automake链接的情况下编译?

时间:2009-06-11 19:46:00

标签: gcc makefile linker compilation automake

我是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?

4 个答案:

答案 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

如果您有多个目标foobarbaz,则可以在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手册。