如何使用 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.am
的 lib_LIBRARIES
部分并创建 crt1_o_SOURCES
。然而,这给出了一个错误:
error: 'crt1.o' is not a standard library name
在这一点上,我想不出更多可能的方法来做到这一点。
如何使用 Automake 编译和安装单个目标文件?
非常具体的要求:
crt1.o
不能内置到它自己的共享库或存档中。它必须只是一个目标文件。这是编译器强制要求的,所以我束手无策。
如果 DESTDIR
更改后可以跟踪此文件并将其安装到正确的位置,那就太好了。
通常目标文件本身是没有用的。我不能运行,它只能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
这会将目标文件视为数据文件,并将数据文件安装到所选路径。
同样,我几乎可以肯定这不是您真正需要的,但至少您知道如何安装目标文件。
您可能需要的是以下之一:
- 将目标文件构建为可执行文件,并安装该可执行文件
- 将对象文件构建到共享对象库中,并安装该库
- 将目标文件构建到库存档(即 .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 的回答,这是我的灵感!
我希望使用 Automake 和 Autoconf 构建目标文件(crt1.o
,一个 C 启动文件)并将其安装到库目录 (/usr/lib
) 中。
因此,我最初的想法是在 Makefile.am
文件中创建一个 crt_DATA
变量,并定义关于如何构建文件的特殊目标。但是,这个想法有一个问题:文件将被安装在数据目录而不是库目录中。
然后我继续尝试将 crt1.o
添加到 Makefile.am
的 lib_LIBRARIES
部分并创建 crt1_o_SOURCES
。然而,这给出了一个错误:
error: 'crt1.o' is not a standard library name
在这一点上,我想不出更多可能的方法来做到这一点。
如何使用 Automake 编译和安装单个目标文件?
非常具体的要求:
crt1.o
不能内置到它自己的共享库或存档中。它必须只是一个目标文件。这是编译器强制要求的,所以我束手无策。如果
DESTDIR
更改后可以跟踪此文件并将其安装到正确的位置,那就太好了。
通常目标文件本身是没有用的。我不能运行,它只能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
这会将目标文件视为数据文件,并将数据文件安装到所选路径。
同样,我几乎可以肯定这不是您真正需要的,但至少您知道如何安装目标文件。
您可能需要的是以下之一:
- 将目标文件构建为可执行文件,并安装该可执行文件
- 将对象文件构建到共享对象库中,并安装该库
- 将目标文件构建到库存档(即 .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 的回答,这是我的灵感!