【问题标题】:Easy way to build objects for target and x86 at the same time同时为目标和 x86 构建对象的简单方法
【发布时间】:2013-12-20 10:18:05
【问题描述】:

目前,这就是我为我的 x86 编译器构建目标文件的方式。

CC=g++
%.o: %.cpp
     $(CC) $(CFLAGS) $(INCPATH) $(LIBPATH) -DPC -c $^ -o $@

如何在 g++ 和我的交叉编译器之间轻松切换?如何同时为我的目标编译 x86 和二进制文件?我现在似乎仅限于使用一种编译器进行编译。有没有办法实现这一点,而不必一一列出我所有的目标文件?

【问题讨论】:

    标签: build compilation makefile cross-compiling


    【解决方案1】:

    你可以在给make的时候传递工具链

    只需一个额外的变量 CROSS_COMPILE 就可以做到这一点

    makefile 宁愿看起来像这样

    CROSS_COMPILE :=
    
    CC=$(CROSS_COMPILE)g++
    
    
    %.o: %.cpp
    
         $(CC) $(CFLAGS)$(INCPATH) $(LIBPATH) -DPC -c $^ -o $@
    

    所以如果你只给make 那么CC 被用作g++ 并被编译为x86,如果你给make CROSS_COMPILE=arm-none-linux-gnueabi- 那么它将被编译为ARM

    你可以使用任何你想要的工具链概念保持不变

    【讨论】:

      【解决方案2】:

      Sagar 的回答确实解决了如何在编译器之间切换,但没有解决如何做到这一点以及问题的主要部分,即如何同时执行两个目标。

      如果要同时做两个目标,你可能想把对象分开到与所使用的编译器或目标相关的目录中,然后根据对象的目录,找出要使用的编译器。

      所以,如下所示,在最简单的情况下,源位于当前目录中,并且该目录与编译器名称相同。根据目标文件的目录,即函数的参数 $1,填写用户定义的 COMPILER 函数,以计算编译器名称的方式。

      define COMPILER
      $1
      endef
      
      .PRECIOUS: %/.
      %/.:
              mkdir -p $@
      
      .SECONDEXPANSION:
      %.o: $$(notdir $$*.cpp) | $$(@D)/.
              $(call COMPILER, $(@D)) -c $< -o $@
      

      【讨论】:

      • 将 .SECONDEXPANSION 作为依赖项的正确语法是什么?它会是目标:.SECONDEXPANSION?
      • @Olihoops 这不是依赖,它只是一个内置关键字,查看手册,需要它,所以我可以在这里计算 $$
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 2018-01-03
      • 1970-01-01
      • 2016-01-03
      • 2010-12-07
      • 1970-01-01
      • 2011-11-27
      相关资源
      最近更新 更多