Проблема компиляции с использованием make-файла в Ubuntu - PullRequest
0 голосов
/ 21 февраля 2019

ПРЕДИСЛОВИЕ: Я должен признать, что я полный новичок в 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

Перед этим я просто вызываю make в папке, где находится программа и make-файл.Поскольку он отлично работает на школьном компьютере, и я получаю ошибку «Конфликтующая архитектура процессора», я склонен полагать, что есть ошибка либо с моей 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}

1 Ответ

0 голосов
/ 21 февраля 2019

Ваш make-файл имеет жестко закодированные цепочки инструментов, специфичные для руки.Вы можете немного настроить его так, чтобы он мог работать на 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 в условие, а также они специфичны для руки.Вы также можете настроить, если вы хотите работать на других архитектурах ЦП.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...