Я пытаюсь скомпилировать программу C, связывающую два ранее созданных объектных файла, но продолжаю получать ошибку «неопределенная ссылка».
Я использую Visual Code для написания кода и Ubuntu для Windows для компиляции с использованием make-файла. Два файла C, задача5.с и реверс.c, которые были преобразованы в объектные файлы, содержат операторы #include reverse.h
, которые содержат прототипы функций в реверс.c.
задача5.с
#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");
}
реверс.c
#include <stdio.h>
#include <stdlib.h>
#include "reverse.h"
char *reverse(const char *str) {
//code
}
int string_length(const char *str) {
//code
}
реверс.ч
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
@Someprogrammerdude Какая часть не совпадает? Если вы имеете в виду «В функции `ctap_tests’:» ctap_tests присутствует, потому что макрос TESTS{} расширяется до «void ctap_tests(void)» в соответствии с VSCode, когда я наводил курсор на TESTS{} в task5.c.
Ах, я только что попытался скомпилировать его, используя «gcc -o linked task5.o reverse.o» вместо make linked, и это сработало. Я не уверен, зачем использовать другой make-файл, но спасибо, что заставили меня его проверить, определенно что-то не так с make-файлом.
Попробуйте использовать команду ls
, чтобы вывести список файлов в текущем каталоге. У вас есть несколько make-файлов (и помните, что файловые системы Linux чувствительны к регистру)? Если есть только один, если вы наберете его (командой cat
), это тот, который вы ожидаете?
Команда ls по-прежнему показывает только один make-файл как «makefile.mk», когда я использую команду cat, это точно такой же make-файл, который я вижу в VSCode, поэтому я не уверен, на какой другой make-файл будет ссылаться и почему выход не тот.
Попробуйте переименовать Makefile
Согласно эта документация GNU make
, программа GNU make попытается использовать GNUMakefile
, makefile
или Makefile
.
Программа make
будет пытаться нетmakefile.mk
, что означает, что, например. make linked
не будет использовать make-файл и только правила по умолчанию.
Вы можете решить эту проблему, либо переименовав свой make-файл как Makefile
(наиболее распространенный) или makefile
; Или с помощью опции -f
, чтобы указать make-файл
$ make -f makefile.mk linked
Спасибо! Вы были правы, именно так VSCode назвал make-файл, когда я его сохранил, я просто переписал его в notepad++ и сохранил как просто make-файл (VSCode мне не позволил), и это сработало!
У вас есть make-файл, который связывает оба объектных файла. Но вы, кажется, не используете его? Или использовать старый make-файл? Потому что вывод, который вы показываете, не соответствует показанному вами make-файлу.