我希望使用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
,可以跟踪此文件并将其安装到正确的位置,那就太好了。
答案 0 :(得分:1)
通常,目标文件本身并不有用。我无法运行,除链接到其他目标文件以创建程序外,无法使用它。
如果要构建库,则可能需要“共享对象”文件或.so
文件。或者,如果您希望静态链接库,则可能需要“库文件”或.la
文件。
Automake使用Libtool来构建两种库文件,但是会变得复杂。这是因为这些库文件在多个平台上有所不同,并且automake / libtool会尝试为您处理平台差异。
假设以上信息不是您所需要的,并且您确实要安装.o
文件,则应将以下内容添加到Makefile.am
somethingdir = /path/to/where/you/want/the/file
something_DATA = the_file.o
这会将目标文件视为数据文件,并将数据文件安装在选定的路径上。
同样,我几乎可以肯定这不是您真正需要的,但是至少您确实知道如何安装目标文件。
您可能需要的是以下之一:
作为普通对象文件.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的回答,这是我的灵感!