Как исправить «неопределенную ссылку» при компиляции в C? - PullRequest
1 голос
/ 10 апреля 2019

Я пытаюсь скомпилировать программу на C, связывающую два ранее созданных объектных файла, но продолжаю получать ошибку «неопределенная ссылка».

Я использую Visual Code для написания кода и Ubuntu в Windows для компиляциииспользуя make-файл.Оба файла C, task5.c и reverse.c , которые были преобразованы в объектные файлы, содержат операторы #include reverse.h, которые содержат прототипы для функций в обратном порядке .c .

task5.c

#include <stdio.h>
#include "ctap.h"
#include "reverse.h"

TESTS {
    const char *a = "Family";
    char *b = reverse(a);

    //test 1
    ok(string_length(a) == string_length(b), "Strings are the same size");

    //test 2
    is("ylimaF", b, "Strings match");
}

reverse.c

#include <stdio.h>
#include <stdlib.h>
#include "reverse.h"

char *reverse(const char *str) {
    //code
}

int string_length(const char *str) {
    //code
}

reverse.h

char *reverse(const char *str);
int string_length(const char *str);

makefile

linked:
    gcc -o linked task5.o reverse.o

task5.o
    gcc -c -o task5.o task5.c

reverse.o
    gcc -c -o reverse.o reverse.c

Когда я запускаю команду make linked Я ожидаю, что она будет выполнена и ничего не вернет.

Но когда я запускаю эту команду, я получаю эту ошибку:

cc   task5.o   -o linked
task5.o: In function `ctap_tests':
task5.c:(.text+0x1abe): undefined reference to `reverse'
task5.c:(.text+0x1ace): undefined reference to `string_length'
task5.c:(.text+0x1adc): undefined reference to `string_length'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'linked' failed
make: *** [task5] Error 1

1 Ответ

1 голос
/ 10 апреля 2019

Согласно этой документации GNU make программа GNU make попытается использовать GNUMakefile, makefile или Makefile.

Программа make not try makefile.mk, что означает, что, например, make linked не будет использовать make-файл и только правила по умолчанию.

Вы можете решить эту проблему, переименовав ваш make-файл в Makefile (наиболее часто встречающийся) или makefile;Или с помощью опции -f, чтобы указать make-файл

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