Makefile库的前提条件

我有一个makefile,我正在使用它来交叉编译并使用gcc嵌入ARM平台。 特别是,我使用arm-none-eabi-gcc,但是与avr-gcc,msp430-gcc等相同。通常,在使用make + gcc(而不是交叉编译)时,我将libs列为前提条件,如下所示:

programA.elf: programA.o foo.o -lm ...etc
programB.elf: programB.o bar.o -lftdi ...etc

%.elf:
    gcc $(LDFLAGS) -o $@ $^

使句柄非常好地处理这个“-lsyntax”,如果你正在构建多个程序/目标并且想要有一个通用的链接规则,那么它就非常方便。 我在交叉编译时遇到的问题是arm-none-eabi-gcc显然与我的系统的gcc libm.so有不同的libm.a(例如),但Make不知道这里发生了什么,试图使用x86 libm而不是基于ARM的。 我可以通过添加下面的代码来完成工作:

.LIBPATTERNS = /usr/lib/arm-none-eabi/newlib/lib%.a

但它看起来有点笨拙,并且暴露了任何人想要编译该项目,以了解更多关于工具链的安装位置的信息。

我的问题是:“是否有一个更好的约定来列出一个二进制的lib依赖关系,我应该在这里使用,在交叉编译时不会中断?”


这可以做到。 但一般的解决方案很复杂。 我有Makefile,它可以从一组源代码构建arm,x86和c67可执行文件。 您参考的页面不包括VPATH。 我为每个架构建议一个单独的子目录。 以下是不工作的代码,但它提供了这个想法

all:  arm/pgma x86/pgma
vpath %.c $(CURDIR)
arm x86:
        mkdir -p $@
arm/pgma: arm/main.o arm/sub.o | arm
x86/pgma: x86/main.o x86/sub.o more.o | x86
arm/%: CC=arm-none-eabi-gcc
arm/%: CFLAGS += -march=armv7-a -mtune=corex-a8
x86/%: CC=gcc
arm/%: VPATH = /usr/lib/arm-none-eabi/newlib
# Notice, VPATH not needed for x86 since it is the native host

这个完整的概念可以扩展到构建依赖文件的每个子目录以及调试和发布变体。 我没有用-lfoo试过这个,但它应该可以工作。 例如,

arm/pgma: arm/main.o arm/sub.o -lmylib | arm
链接地址: http://www.djcxy.com/p/15247.html

上一篇: Makefile library prerequisite

下一篇: compiling and running hello world for ARM Linux