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

问题描述 投票:1回答:2

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

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

然后我尝试将crt1.o添加到lib_LIBRARIESMakefile.am部分并创建crt1_o_SOURCES。但是,这给出了一个错误:

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

目前,我想不出任何其他可行的方法。

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


非常具体的要求:

  • crt1.o 无法内置到其自己的共享库或档案中。它必须是just一个目标文件。编译器要求使用这种方式,因此我需要束缚双手。

  • 如果更改DESTDIR,可以跟踪此文件并将其安装到正确的位置,那将是很可爱的。

c makefile autoconf automake
2个回答
1
投票

通常,目标文件本身无用。我无法运行,除链接到其他目标文件以创建程序外,无法使用它。

如果您要构建库,则可能需要“共享对象”文件或.so文件。或者,如果您希望静态链接库,则可能需要“库文件”或.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和构建系统,就不能轻易使用。


1
投票

我最终要做的是这个:

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的回答,这是我的灵感!

© www.soinside.com 2019 - 2024. All rights reserved.