【问题标题】:How do you compile without linking in Automake?如何在不链接 Automake 的情况下进行编译?
【发布时间】:2010-11-02 06:20:25
【问题描述】:
我是 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?
【问题讨论】:
标签:
gcc
makefile
linker
compilation
automake
【解决方案1】:
一种方法是通过提供不链接的链接命令来欺骗 Automake:
thread_LINK = true
除此之外,如果 Automake 没有这样的功能,我不会感到惊讶。
【解决方案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
【解决方案3】:
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)
现在您明确要求仅当您键入 make build 时才构建文件 Thread.$(OBJEXT),就像您原来的 Makefile 一样。
(Automake 使用.$(OBJEXT) 而不是.o 来支持DOS 变体中的.obj 等扩展。)
【解决方案4】:
首先,automake 是一个自动制作 Makefile 的工具; make 本身就是一个完全不同的野兽(我很确定您正在寻找的是一个 make 解决方案)。
这是完成您想要的最简单的基于 GNU 的 Makefile:
all: Thread.o
这会(默认情况下)填充如下内容(请将 4 空格空格更改为硬制表符):
all: Thread.o
Thread.o: Thread.cc
$(COMPILE.cpp) $(OUTPUT_OPTION) $<
COMPILE.cpp 和 OUTPUT_OPTION 宏当然默认扩展为 GNU 生成指定值并且不可移植;尽管根据 pmake(1) 的手册页,$
GNU make 有一个可以使用的隐式与显式规则、模式、后缀等的概念,但这并不适用于所有版本的 make,因此这就是为什么所有 Makefile 都以目标明确说明的原因和变量,因为 POSIX 并没有描述人们应该如何编写 Makefile 的许多所需场景。
运行 gmake -p 了解更多详细信息,并查看 gmake 的 texinfo 手册,主题为隐式、显式规则、模式、后缀等。