LA_*_*LA_ 2 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
Run Code Online (Sandbox Code Playgroud)
我用以下命令执行它:
make ARCH=$TARGET_ARCH \
CROSS_COMPILE=$TARGET_PREFIX \
SRC_DIR=$ROOT/$PKG_BUILD
Run Code Online (Sandbox Code Playgroud)
但它忽视ARCH和CROSS_COMPILE重视.我试图取代$(CC)与$(MAKE)和补充-$(MAKEFLAGS),但它说Nothing to be done for 'Main.cpp'.
如何修复它并添加交叉编译支持?
你传递给的东西make(例如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
Run Code Online (Sandbox Code Playgroud)
进行交叉编译的标准方法是覆盖编译器/链接器.例如,以下内容将交叉编译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++
Run Code Online (Sandbox Code Playgroud)
你的makefile有很多问题......
CC是C编译器的标准变量; 用于C++ - 编译器使用CXX
现代链接器将丢弃未使用的符号,如果您没有获得正确的顺序,则可能导致链接器错误.因此,您应该将$(LIBS)变量放在链接器调用的最后
make真正的强大之处在于能够解决依赖关系(找出几个文件发生变化时需要重新编译构建树的哪些部分).为此,您需要编写编码这些依赖项的规则 - 而不是召唤任意目标名称并强制重建所有内容.
小智 1
我会尝试的一个可能的例子如下,假设在这个简单的例子中 $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
Run Code Online (Sandbox Code Playgroud)
编辑:这假设工具链存在于您的路径中。编辑:也可能修改它,使得 CC=$(PREFIX)-g++ 这完全取决于您传递给它的内容如何映射到您的工具链命名约定。