我有以下 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
但它忽略了ARCH
and CROSS_COMPILE
价值观。我尝试更换$(CC)
with $(MAKE)
并添加了-$(MAKEFLAGS)
,但它说的是Nothing to be done for 'Main.cpp'
.
如何修复它并添加交叉编译支持?
The things你正在传递到make
(e.g. ARCH=$TARGET_ARCH
)真的只是Makefile variables
.
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 有很多问题......
变量名
CC
是标准变量C编译器; for a C++-编译器 use CXX
链接顺序很重要
现代链接器将丢弃未使用的符号 https://stackoverflow.com/questions/45135/,如果顺序不正确,可能会导致链接器错误。因此你应该把$(LIBS)
链接器调用最后的变量
声明依赖关系
的力量make
真正在于解决依赖关系的能力(当一些文件发生更改时找出构建树的哪些部分需要重新编译)。为此,您需要编写对这些依赖项进行编码的规则 - 而不是想出任意目标名称并强制重建所有内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)