Opened 5 years ago

Last modified 4 years ago

#430 assigned ожидается проверка

WW #1

Reported by: andreev.nikita Owned by: Sokolov Viacheslav
Component: WW_make Version: 2.0
Keywords: Cc:

Description


Change History (4)

comment:1 Changed 4 years ago by Sokolov Viacheslav

Type: ожидается проверкаожидаются исправления

multiple definition - у меня воспроизводится

unresolved symbol / undefined reference - не увидел. Это проблема этапа компоновки (линковки).

gcc -c -Wall -Wextra -Werror -Iinclude src/main.c -o bin/main.o
src/main.c: In function ‘main’:
src/main.c:5:11: error: implicit declaration of function ‘doComputation’ [-Werror=implicit-function-declaration]
   int a = doComputation(5, 7.0);
           ^~~~~~~~~~~~~
cc1: all warnings being treated as errors
Makefile:6: recipe for target 'bin/main.o' failed

Здесь другая проблема, на этапе компиляции: в main.c "вызывается" необъявленная ранее функция (она не приходит с зависимостями .h). Компилятор считает это декларацией функции, и сообщает, что декларация эта выглядит странно.

Суть же ошибки в том, что для какой-то декларации (объявления) не предоставлена реализация (definition). То есть обещали какую-то функцию, но обещание не сдержали.

correct: проект собирается и повторный запуск make не приводит к пересборке, это главное.

Makefile:
цель bin/test.o стоит удалить, потому что рецепт не может быть выполнен - нет test.c

зависимости от заголовочных файлов, order-only зависимости - здесь все верно

не хватает цели
all: lab_01

цели, не соответствующие файлам на диске, стоит пометить как
.PHONY:

в противном случае создание файла clean рядом с Makefile приведет к тому, что make clean не будет работать

цель clean реализована не вполне корректно, потому что если сборка не удалась (например, вообще не производилась), make clean завершится с ошибкой:

rm -r bin
rm: cannot remove 'bin': No such file or directory
Makefile:16: recipe for target 'clean' failed
make: *** [clean] Error 1

стоит либо использовать rm -rf, либо сделать проверку наличия директории bin / файла lab_01 (здесь поможет функциональность bash)

Почему-то все файлы помечены исполняемыми (набор прав -rwxr-xr-x):

╰─>$ ls -lh
total 16K
-rwxr-xr-x 1 nicesap nicesap 177 окт 29 01:42 algorithm.c*
-rwxr-xr-x 1 nicesap nicesap  87 окт 29 01:42 io.c*
-rwxr-xr-x 1 nicesap nicesap 170 окт 29 01:42 main.c*
-rwxr-xr-x 1 nicesap nicesap 425 окт 29 01:42 util.c*

Хотя достаточно набора прав -rw-r--r--

Код:
лучше не смешивать пробелы и табуляции в рамках одного проекта, с кодом становится неудобно работать

╰─>$ cat *
#include "algorithm.h"
#include "util.h"
#include "io.h"

int doComputation(int a, int b) {
  int c = max(a, b+3);
  logDebug("computation performed\n");
  return c;
}
#include "io.h"
#include <stdio.h>

void logDebug(char* s) {
        printf("%s", s);
}

doComputation(5, 7.0)
здесь происходит вызов функции int doComputation(int a, int b), но аргументы передаются типов (int, double). Это не очень хорошая мысль, обычно это источник ошибок. Лучше максимально педантично следить за корректностью типов. В языке Си это сложнее, в Си++ в некотором смысле проще.

comment:2 Changed 4 years ago by andreev.nikita

Type: ожидаются исправленияожидается проверка
Version: 1.02.0

comment:3 Changed 4 years ago by andreev.nikita

svn commit и svn up не загружает изменения почему-то... не проверяйте пока

comment:4 Changed 4 years ago by andreev.nikita

отправилось - всё хорошо

Note: See TracTickets for help on using tickets.