如何修改makefile以支持交叉汇编



我有以下makefile:

CC=g++
top_srcdir=$(SRC_DIR)/cpp/src/
INCLUDES:= -I $(top_srcdir) -I $(top_srcdir)command_classes -I $(top_srcdir)platform -I $(top_srcdir)value_classes
LIBS:= -lopenzwave -lpthread -ludev
LDFLAGS += -L$(SRC_DIR) -Wl,-R$(SRC_DIR) '-Wl,-R$$ORIGIN'
all:    ozw
ozw: Main.cpp
    $(CC) $(INCLUDES) -c Main.cpp -o ozw-power-on-off.o
    $(CC) $(LIBS) $(LDFLAGS) ozw-power-on-off.o -o ozw-power-on-off.out
clean:
    rm -rf *.o *.out

我使用以下命令执行它:

  make ARCH=$TARGET_ARCH 
       CROSS_COMPILE=$TARGET_PREFIX 
       SRC_DIR=$ROOT/$PKG_BUILD

,但它忽略了ARCHCROSS_COMPILE值。我尝试用$(MAKE)替换$(CC)并添加-$(MAKEFLAGS),但它说Nothing to be done for 'Main.cpp'

如何修复并添加交叉汇编支持?

事物您传递给make(例如ARCH=$TARGET_ARCH)实际上只是Makefile variablesmake根本不知道它们与跨编译有关(这只是您在大脑中关联的东西)。例如

 $ cat Makefile
 ARCH=pdp-11
 foo:
    @echo arch: $ARCH
 $ make
 arch: pdp-11
 $ make ARCH=le-corbusier
 arch: le-corbusier

进行交叉补偿的标准方法是覆盖编译器/链接器。例如。以下将使i686-w64-mingw32交叉编译:

  $ cat Makefile
  .PHONY: ozw
  owz: ozw-power-on-off.out
  ozw-power-on-off.o: Main.cpp
      $(CXX) $(INCLUDES) $(CPPFLAGS) $(CXXFLAGS) -c $^ -o $@
  ozw-power-on-off.out: ozw-power-on-off.o
      $(CXX) -o $@ $(LDFLAGS) $^ $(LIBS)
  $ make CXX=i686-w64-mingw32-g++

一些注释

您的makefile有许多问题...

变量名称

CC c compiler 的标准变量;对于 c - 编译器使用CXX

链接顺序很重要

现代链接器将丢弃未使用的符号,如果您没有正确的订单,可能会导致可能的链接错误。因此,您应该将$(LIBS)变量放在链接器发电的末尾

声明依赖项

make的功率确实在于能够解决依赖关系(找出几个文件更改时需要重新编译构建树的哪些部分)。为此,您需要编写编码这些依赖项的规则,而不是想起任意目标名称和强制重建所有内容。

我要尝试的东西的一个可能的例子是在这个琐碎的示例中假设$ aCh get映射到" ARM"。我没有测试过,但以前做过类似的事情。

CC=g++
CC-arm=arm-g++
ozw: Main.cpp
    $(CC-$(ARCH)) $(INCLUDES) -c Main.cpp -o ozw-power-on-off.o
    $(CC-$(ARCH)) $(LIBS) $(LDFLAGS) ozw-power-on-off.o -o ozw-power-on-off.out

编辑:这假定工具链存在于您的路径中。编辑:也可能会修改它,以使cc = $(prefix)-g 它完全取决于您如何将其传递到工具链命名命名约定中的内容。

最新更新