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

时间:2019-10-06 04:41:44

标签: c makefile autoconf automake

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

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

然后,我尝试将crt1.o添加到lib_LIBRARIES的{​​{1}}部分中并创建Makefile.am。但是,这产生了一个错误:

crt1_o_SOURCES

在这一点上,我想不出任何其他可行的方法来实现这一目标。

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


非常具体的要求:

  • error: 'crt1.o' is not a standard library name 不能内置到其自己的共享库或档案中。它必须是 just 一个目标文件。编译器要求使用这种方式,因此我需要束缚双手。

  • 如果更改了crt1.o,可以跟踪此文件并将其安装到正确的位置,那就太好了。

2 个答案:

答案 0 :(得分: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 :(得分: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的回答,这是我的灵感!

相关问题