Makefile库的先决条件

时间:2015-07-08 18:35:53

标签: gcc makefile embedded

我有一个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依赖项?"

1 个答案:

答案 0 :(得分:0)

这可以做到。但一般的解决方案很复杂。我有Makefiles,可以从一组源代码构建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