我正在使用Automake和Autoconf将目标文件(crt1.o
,C启动文件)构建并安装到库目录(/usr/lib
)中。
因此,我最初要做的是在crt_DATA
文件中创建一个Makefile.am
变量,并定义有关如何构建该文件的特殊目标。但是,这个想法有一个问题:该文件将安装在数据目录而不是库目录中。
然后我尝试将crt1.o
添加到lib_LIBRARIES
的Makefile.am
部分并创建crt1_o_SOURCES
。但是,这给出了一个错误:
error: 'crt1.o' is not a standard library name
目前,我想不出任何其他可行的方法。
如何使用Automake编译和安装单个目标文件?
非常具体的要求:
crt1.o
无法内置到其自己的共享库或档案中。它必须是just一个目标文件。编译器要求使用这种方式,因此我需要束缚双手。
如果更改DESTDIR
,可以跟踪此文件并将其安装到正确的位置,那将是很可爱的。
通常,目标文件本身无用。我无法运行,除链接到其他目标文件以创建程序外,无法使用它。
如果您要构建库,则可能需要“共享对象”文件或.so
文件。或者,如果您希望静态链接库,则可能需要“库文件”或.la
文件。
Automake使用Libtool来构建两种库文件,但是会变得复杂。这是因为这些库文件在多个平台上有所不同,并且automake / libtool会尝试为您处理平台差异。
假设上面的信息不是您所需要的,并且您确实要安装.o
文件,则应将以下内容添加到Makefile.am
中
somethingdir = /path/to/where/you/want/the/file
something_DATA = the_file.o
这会将目标文件视为数据文件,并将数据文件安装在所选路径上。
再次,我几乎可以肯定这不是您真正需要的,但是至少您确实知道如何安装目标文件。
您可能需要的是以下之一:
作为普通目标文件,.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的回答,这是我的灵感!