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

标签 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 值。我试图用 $(MAKE) 替换 $(CC) 并添加了 -$(MAKEFLAGS),但它说 Nothing为“Main.cpp”完成

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

最佳答案

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

 $ 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 有很多问题...

变量名

CCC-Compiler 的标准变量;对于 C++ 编译器 使用 CXX

链接顺序很重要

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

声明依赖

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

关于c++ - 如何修改Makefile以支持交叉编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37866783/

相关文章:

android - Android 中使用的默认 C++ 版本是什么?

python - 使用 stdout/stderr 以外的管道与子进程通信

c++ - 为什么这段代码给出错误...... .'a' 是指向字符指针的指针,应该存储 's' 的地址,因为 s 是指向数组第一个元素的指针

makefile - Makefile 中的 $@ 和 $< 是什么?

makefile - 如何告诉 make 观察子 make 目标的依赖关系?

c++ - 在 64 位 CENTO 上重复安装 Perl

c - 寻求有关安装和使用mips-gcc交叉编译器以生成自定义ASM的帮助

c++ - GDB 回溯告诉我符号名称而不是源文件

c - 在c中链接2个目标文件以创建可执行文件

mono - 为arm交叉编译mono