如何使用 Automake 编译和安装单个目标文件?

How do I compile and install an individual object file with Automake?

我希望使用 Automake 和 Autoconf 构建目标文件(crt1.o,一个 C 启动文件)并将其安装到库目录 (/usr/lib) 中。

因此,我最初的想法是在 Makefile.am 文件中创建一个 crt_DATA 变量,并定义关于如何构建文件的特殊目标。但是,这个想法有一个问题:文件将被安装在数据目录而不是库目录中。

然后我继续尝试将 crt1.o 添加到 Makefile.amlib_LIBRARIES 部分并创建 crt1_o_SOURCES。然而,这给出了一个错误:

error: 'crt1.o' is not a standard library name

在这一点上,我想不出更多可能的方法来做到这一点。

如何使用 Automake 编译和安装单个目标文件?


非常具体的要求:

通常目标文件本身是没有用的。我不能运行,它只能link到其他目标文件来制作程序。

如果要构建库,您可能需要 "shared object" 文件或 .so 文件。或者,如果您热衷于静态 linked 库,您可能需要 "library file" 或 .la 文件。

Automake 使用 Libtool 来构建这两种库文件,但它会变得复杂。那是因为这些库文件在多个平台上有些不同,automake/libtool 尝试为您处理平台差异。

假设以上信息不是您所需要的,并且您确实想要安装 .o 文件,那么您应该将以下内容添加到您的 Makefile.am

somethingdir = /path/to/where/you/want/the/file
something_DATA = the_file.o

这会将目标文件视为数据文件,并将数据文件安装到所选路径。

同样,我几乎可以肯定这不是您真正需要的,但至少您知道如何安装目标文件。

您可能需要的是以下之一:

  1. 将目标文件构建为可执行文件,并安装该可执行文件
  2. 将对象文件构建到共享对象库中,并安装该库
  3. 将目标文件构建到库存档(即 .la 文件)中,然后安装该库存档。

作为普通目标文件,.o 文件在没有用于构建它们所需的头文件的情况下无法轻易使用,并且通常也用于构建它们的 Makefile 和构建系统。

我最后做的是这样的:

crtdir = $(libdir)
crt_DATA = crt1.o Scrt1.o crti.o crtn.o

crt1.o: $(top_srcdir)/src/crt/crt1.c
        $(CC) -c -fno-PIC $(AM_CPPFLAGS) $(CFLAGS) -o $@ $^

Scrt1.o: $(top_srcdir)/src/crt/crt1.c
        $(CC) -c -fPIC $(AM_CPPFLAGS) $(CFLAGS) -o $@ $^

crti.o: $(top_srcdir)/arch/$(ARCH)/src/crt/crti.s
        $(CCAS) -c $(CFLAGS) -o $@ $^

crtn.o: $(top_srcdir)/arch/$(ARCH)/src/crt/crtn.s
        $(CCAS) -c $(CFLAGS) -o $@ $^

当然,制表符和空格乱七八糟,但仍然如此。

感谢@EdwinBuck 的回答,这是我的灵感!