如何修改Makefile以支持交叉编译?

时间:2016-06-16 18:28:15

标签: c++ makefile cross-compiling

我有以下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值。我尝试将$(CC)替换为$(MAKE)并添加-$(MAKEFLAGS),但它是在说Nothing to be done for 'Main.cpp'

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

2 个答案:

答案 0 :(得分:5)

您传递给make内容(例如ARCH=$TARGET_ARCH)实际上只是Makefile variablesmake根本不知道它们与交叉编译有关(这只是你在大脑中关联的东西)。 E.g。

 $ 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

链接订单事项

现代链接器将discard unused symbols,如果您没有获得正确的顺序,则会导致链接器错误。因此,您应该将$(LIBS)变量放在链接器调用的最后

声明依赖

make的强大功能在于能够解决依赖关系(找出几个文件发生变化时需要重新编译构建树的哪些部分)。为此,您需要编写编码这些依赖项的规则 - 而不是召唤任意目标名称并强制重建所有内容。

答案 1 :(得分:0)

我想尝试的一个可能的例子是在这个简单的例子中假设$ ARCH 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 ++这一切都取决于你传递给它的方式映射你的工具链命名约定。