Как исправить ошибку gcc not found в файле make, хотя он установлен и работает нормально? - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь скомпилировать и связать программу на ассемблере и c, используя GCC и GNU Make, но когда я запускаю команду "make", она выдает ошибку "не удалось найти GCC", даже если она установленаи работает корректно, после некоторого исправления make-файла теперь выдает команду make find find в строке 14 !!!

Я уже пытался скомпилировать ее на другом компьютере, но она не сработала. И, конечно, я пытался запускать обычные команды GCC, и это работало отлично! Кажется, все в порядке с переменными среды. Если я пытаюсь выполнить команды без make, он выдает синтаксическую ошибку linker.ld, но я предполагаю, что это происходит на мне.

Создать файл:

CC=gcc 
TARGET=bookOs
C_FILES=./kernel.c
OBJS=$(C_FILES:.c=.o) 

all compile: $(TARGET) 
all: finale 
.PHONY: all compile clean finale 

%.o: 
    gcc -c $(@:.o=.c) -ffreestanding -fno-exceptions -m32 

$(TARGET): $(OBJS) 
    ​$(shell nasm -f elf start.asm -o start.o)
    ​gcc -m32 -nostdlib -nodefaultlibs -lgcc start.o  $? -T linker.ld -o $(TARGET)

finale: 
    ​$(shell cd ~/Desktop/bookOs/) ​
    $(shell cp $(TARGET) ./iso/boot/$(TARGET))
    $(shell grub2-mkrescue iso --output=$(TARGET).iso) 

clean: 
    ​rm -f *.o $(TARGET) $(TARGET).iso 
    ​find . -name \*.o | xargs --no-run-if-empty rm

Файл сборки:


bits 32
global _start 
extern kernel_early
extern main

section .text 
    align 4
    dd 0x1BADB002   ;magic
    dd 0x00
    dd - (0x1BADB002 + 0x00)    ;checksum
_start: 
    cli 
    mov esp, stack
    call kernel_early
    call main
    hlt

section .bss
resb 8192

stack:

C Файл:

static char* const VGA_MEMORY = (char*)0xb8000;

static const int VGA_WIDTH = 80;

static const int VGA_HEIGHT = 25;

void kernel_early(void) 
{  }

int main(void) {
    const char *str = "Hello world"; unsigned int i = 0;
    string position unsigned int j = 0; // place holder for video buffer position 

    ​while (str[i] != '\0') { ​
        VGA_MEMORY[j] = str[i];
        ​VGA_MEMORY[j + 1] = 0x07; 
        ​i++; ​j = j + 2; 
    ​} ​

    return 0; 

}

Файл ссылки:

SECTIONS 
{ 
    . = 0x100000; 
    .text : { *(.text) } 
    .bss  : { *(.bss)  } 
}

Это ошибка, которую в данный момент выдает:

make: ​: Command not found
make: *** [Makefile:14: bookOs] Error 127

Я ожидаю, что этот make-файл сгенерирует вывод, связывающий файл c и файл сборки. Заранее спасибо!

1 Ответ

5 голосов
/ 14 октября 2019

Команды, начинающиеся с $(shell, не выполняют ожидаемых действий. Пожалуйста, прочитайте документацию make:

[...] она принимает в качестве аргумента команду оболочки и оценивает ее вывод.

Всепосле запуска shell в качестве команды оболочки И, ТО, вывод этой команды интерпретируется make, как если бы он был буквально в Makefile. В вашем случае это будет команда. Один пример из документации:

files: = $ (shell echo * .c)

Таким образом, решение состоит в том, чтобы удалить $(shell и закрывающую скобку.

Подсказка: чтобы увидеть, что будет делать make, фактически не делая этого, вызовите его с опцией -n.

...