gpt4 book ai didi

linux - 在 Ubuntu 上使用 makefile 编译时出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 11:54:38 25 4
gpt4 key购买 nike

前言:我必须承认我是 Ubuntu 及其所有怪癖的完全菜鸟,所以请保持温和。

所以我得到了这个程序,我们将它用于我们在大学计算机实验室完成的一项作业 - 它在那里运行得非常好。当我尝试在我的家用计算机上编译时,它给了我这个:

Compiling project
/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: error:
/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/crt0.o: Conflicting CPU architectures 12/1
/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: failed to merge target specific data of file /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/crt0.o
collect2: error: ld returned 1 exit status
Makefile:34: recipe for target 'default' failed
make: *** [default] Error 1

在此之前,我只是在程序和makefile所在的文件夹中调用make。由于它在学校计算机上运行良好并且我收到“冲突的 CPU 体系结构”错误,我倾向于认为我的 Ubuntu 或 GCC 安装存在错误。

Ubuntu 版本:

No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.2 LTS
Release: 18.04
Codename: bionic

Hardinfo produces this

FAMILY := nrf51
SOURCES := main.c uart.c

BUILD_DIR := .build_system
LINKER_SCRIPT := $(BUILD_DIR)/linker_script.ld

GNU_PREFIX := arm-none-eabi
CC := $(GNU_PREFIX)-gcc
OBJCOPY := $(GNU_PREFIX)-objcopy
OBJDUMP := $(GNU_PREFIX)-objdump

QUIET := @

## Compiler flags
# CPU specific
CFLAGS += -mcpu=cortex-m0 -mthumb -mabi=aapcs -mfloat-abi=soft
# Get linker optimization for free
CFLAGS += -ffunction-sections -fdata-sections --short-enums
CFLAGS += -fno-strict-aliasing -fno-builtin
# Good pracice
CFLAGS += -Wall -Werror -std=gnu99
# CFLAGS += -ggdb -Og / -O0 / -O3 etc

## Linker flags
CFLAGS += --specs=nosys.specs -Wl,--gc-sections -T $(LINKER_SCRIPT)
# or --specs=nano.specs -lc -lnosys

SOURCES += $(BUILD_DIR)/system_nrf51.c
SOURCES += $(BUILD_DIR)/gcc_startup_nrf51.S

.PHONY: default flash clean

default:
@echo Compiling project
$(QUIET)$(CC) $(CFLAGS) $(SOURCES) -o $(BUILD_DIR)/main.elf
@echo Creating hex file
$(QUIET)$(OBJCOPY) -O ihex $(BUILD_DIR)/main.elf $(BUILD_DIR)/main.hex

flash:
nrfjprog -f $(FAMILY) --sectorerase --program $(BUILD_DIR)/main.hex
nrfjprog -f $(FAMILY) --reset

erase:
nrfjprog -f $(FAMILY) --eraseall

clean:
$(QUIET)rm $(BUILD_DIR)/main.{elf,hex}

最佳答案

您的 makefile 具有特定于 arm 的硬编码工具链。您可以稍微调整一下,使其可以在 x86 上运行:

FAMILY := nrf51
SOURCES := main.c uart.c

BUILD_DIR := .build_system
LINKER_SCRIPT := $(BUILD_DIR)/linker_script.ld

arch = $(shell uname -m)

# Intel 64-bit machine?
ifeq ($(arch),x86_64)
CC := gcc
OBJCOPY := objcopy
OBJDUMP := objdump
else
# Default to arm
GNU_PREFIX := arm-none-eabi
CC := $(GNU_PREFIX)-gcc
OBJCOPY := $(GNU_PREFIX)-objcopy
OBJDUMP := $(GNU_PREFIX)-objdump

# ARM CPU specific
CFLAGS += -mcpu=cortex-m0 -mthumb -mabi=aapcs -mfloat-abi=soft
endif

QUIET := @

...

请注意,我将 CFLAGS 放在条件中,因为它们也是特定于 ARM 的。如果您想在其他 CPU 架构上运行,您可以进行类似的调整。

关于linux - 在 Ubuntu 上使用 makefile 编译时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54804814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com