13

我有两个makefile,用于本机编译和交叉编译。它们之间的唯一区别是编译器名称:

# 生成文件
CC = g++
...
#makefile-cc
CC = arm-linux-gnueabihf-g++
...

要进行本机编译,我执行make,要进行交叉编译,我执行make -f makefile-cc. 我想要一个makefile,它应该make用于本机编译和make cross交叉编译。执行此操作的正确语法是什么,例如:

# makefile(类 C 的伪代码)
如果交叉
    CC = arm-linux-gnueabihf-g++
别的
    CC = g++
4

4 回答 4

19

您可以使用语法target:assignment为特定目标分配/附加变量。这是一个例子:

native: CC=cc
native:
    echo $(CC)

cross: CC=arm-linux-gnueabihf-g++
cross:
    echo $(CC)

打电话

make native

(或只是make,这里)打印

echo cc
cc

并打电话

make cross

印刷

echo arm-linux-gnueabihf-g++
arm-linux-gnueabihf-g++

所以你可以使用你通常的编译行和 $(CC)

于 2012-11-13T09:31:13.420 回答
8

你可以传递参数来制作。
例如make TARGET=nativemake TARGET=cross然后使用它

ifeq ($(TARGET),cross)
        CC = arm-linux-gnueabihf-g++
else
        CC = g++
endif
于 2012-11-13T09:34:03.750 回答
0

不完全是您想要的,但您可以将CC其作为环境变量读取。考虑以下几点Makefile

all:
        echo $(CC)

你可以调用它CC=g++ make给你:

echo g++
g++

或调用它CC=arm-linux-gnueabihf-g++ make给你:

echo arm-linux-gnueabihf-g++
arm-linux-gnueabihf-g++

最好的部分是你可以将它们分别放在你的~/.bashrcasexport CC=g++export CC=arm-linux-gnueabihf-g++中,然后用 only 进行调用make

于 2012-11-13T09:53:58.320 回答
0

另一种比 gnu make way 更便携的ifeq方法是:

CROSS包含arm-linux-gnueabihf-或为空。

CC=$(CROSS)g++

CC 将包含展开结果。

于 2012-11-13T11:36:34.643 回答