Последний шаг в компиляции GCC (ld) - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь написать make-файл, который проходит пошаговую компиляцию, проблема находится на четвертом шаге, связывание.

Программа состоит из нескольких файлов, начиная с main.c:

#include "file1.h"
#include "file2.h"

int main() {
  printout1("Print one");
  printout2(5);
  return 0;
}

file1.h

#include <stdio.h>

void printout1(char *str);

file1.c

#include "file1.h"

void printout1(char *str) {
  printf("%s\n", str);
}

file2.h

#include <stdio.h>
#include "file1.h"

void printout2(int);

file2.c

#include "file2.h"

void printout2(int val) {
  printf("%d\n", val);
  printout1("Print two");
}

Я пытаюсь скомпилировать эту программу со следующим make-файлом:

all:
    cpp main.c main.i 
    gcc -S main.i
    as -o main.o main.s
    ld -o main.o

Произошла следующая ошибка:

ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0
main.o: in function 'main':
main.c:(.text+0xa): undefined reference to 'printout1'
main.c:(.text+0x14): undefined reference to 'printout2'
makefile:2 recipe for target 'all' failed
make:***[all] Error 1

Я довольно новичок в такого рода вещах, и я знаю, что проблема в заголовочных файлах, я просто не знаю, как включить их в это.

1 Ответ

0 голосов
/ 05 мая 2018

Два основной выпусков:

  1. gcc - это интерфейс для всех необходимых шагов - не пытайтесь напрямую вызывать другие инструменты вашей цепочки инструментов, всегда используйте gcc. Это позволит всегда добавлять необходимые параметры для этих других инструментов.

  2. У вас есть функции в разных блоках компиляции (файл1 и файл2), но вы никогда не компилируете и не связываете их.


Разумный Makefile для GNU make с вашей структурой будет выглядеть так:

CC ?= gcc

all: main

main: main.o file1.o file2.o
    $(CC) -o$@ $^

%.o: %.c
    $(CC) -c -o$@ $<

.PHONY: all

Компилирует все .c файлы непосредственно в объектные файлы и, наконец, связывает их (используя $(CC), например, gcc) с вашим конечным исполняемым файлом. Правило all помечено как .PHONY, поскольку оно не создает файл с именем all - вы должны сообщить об этом make.

Конечно, вы можете явно добавить дополнительные шаги, но это не имеет особого смысла.

...