如何修改makefile以支持交叉汇编
How to modify Makefile to support cross compilation?
我有以下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
和CROSS_COMPILE
值。我尝试用$(MAKE)
替换$(CC)
并添加-$(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
进行交叉补偿的标准方法是覆盖编译器/链接器。例如。以下将使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 compiler 的标准变量;对于 c - 编译器使用CXX
链接顺序很重要
现代链接器将丢弃未使用的符号,如果您没有正确的订单,可能会导致可能的链接错误。因此,您应该将$(LIBS)
变量放在链接器发电的末尾
声明依赖项
make
的功率确实在于能够解决依赖关系(找出几个文件更改时需要重新编译构建树的哪些部分)。为此,您需要编写编码这些依赖项的规则,而不是想起任意目标名称和强制重建所有内容。
我要尝试的东西的一个可能的例子是在这个琐碎的示例中假设$ aCh 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
编辑:这假定工具链存在于您的路径中。编辑:也可能会修改它,以使cc = $(prefix)-g 它完全取决于您如何将其传递到工具链命名命名约定中的内容。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用CMake检测支持的C++标准
- 为什么istream不支持右值提取
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 扩展光电二极管探测器以支持多个传感器
- MSVC是否支持C++11样式的属性而不是__declspec
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 在 emscripten 网页汇编正在运行期间更新进度条?
- 为什么我们不编写可以处理C++标识符的汇编器和链接器?
- 哪个C++规范开始支持 std::vector
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 如何检测VS C++编译器是否支持C++11?
- CertGetCertificateChain 具有支持的内存存储和证书信任列表
- Casablanca/cpprestsdk listener.support接受函数,但不支持方法
- 如何修改makefile以支持交叉汇编
- android NDK编译器支持内联汇编吗?(例如asm或__asm关键字?)