Один и тот же Makefile, выполняющий разные команды на разных компьютерах

Во время установки пинто мне пришлось бежать make,

Ниже приведен Makefile.

all: setitimer-helper squish-pty squish-unix

CC = gcc
CFLAGS = -Wall -W
LDFLAGS = -lm
setitimer-helper: setitimer-helper.o
squish-pty: squish-pty.o
squish-unix: squish-unix.o

clean: 
    rm -f *.o setitimer-helper squish-pty squish-unix

На одном компьютере все выполнено правильно. (вывод для команды приведен ниже)

gcc -Wall -W   -c -o setitimer-helper.o setitimer-helper.c
gcc -lm  setitimer-helper.o   -o setitimer-helper
gcc -Wall -W   -c -o squish-pty.o squish-pty.c
gcc -lm  squish-pty.o   -o squish-pty
gcc -Wall -W   -c -o squish-unix.o squish-unix.c
gcc -lm  squish-unix.o   -o squish-unix

но в другом компьютере я получил следующую ошибку

gcc -lm  setitimer-helper.o   -o setitimer-helper
setitimer-helper.o: In function `main':
setitimer-helper.c:(.text+0xc9): undefined reference to `floor'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'setitimer-helper' failed
make: *** [setitimer-helper] Error 1

Если посмотреть на первую строку выводов обоих make команды

gcc -Wall -W   -c -o setitimer-helper.o setitimer-helper.c

а также

gcc -lm  setitimer-helper.o   -o setitimer-helper

Они разные.

Зачем make выполняет разные команды для одного и того же Makefile? и что я должен сделать, чтобы удалить ошибку?

1 ответ

Решение

В первом компьютере setitimer-helper.o файл либо не существует, либо setitimer-helper.c файл более новый, так что make нужно его пересобрать. Таким образом, он запускает компилятор, а затем выполняет операцию ссылки:

gcc -Wall -W   -c -o setitimer-helper.o setitimer-helper.c
gcc -lm  setitimer-helper.o   -o setitimer-helper

На втором компьютере setitimer-helper.o файл уже существует и является более новым, чем setitimer-helper.c файл, поэтому команда компиляции не понадобилась, и второй компьютер перешел непосредственно к строке ссылки:

gcc -lm  setitimer-helper.o   -o setitimer-helper

На самом деле вопрос в том, почему вы получили ошибку компоновщика на втором компьютере.

Ответ на это заключается в том, что -lm Флаг должен появиться в строке компоновщика после объектных файлов. Это происходит потому, что вы добавили -lm к LDFLAGS переменная, которая не является правильной: она должна содержать параметры, которые сообщают компоновщику, где искать файлы и т. д. (например, -L опция).

Библиотеки должны быть добавлены к LDLIBS переменная, не LDFLAGS, Измените свой make-файл на это:

all: setitimer-helper squish-pty squish-unix

CC = gcc
CFLAGS = -Wall -W
LDLIBS = -lm
setitimer-helper: setitimer-helper.o
squish-pty: squish-pty.o
squish-unix: squish-unix.o

clean: 
        rm -f *.o setitimer-helper squish-pty squish-unix

Ваша ссылка будет выглядеть следующим образом:

gcc  setitimer-helper.o   -o setitimer-helper -lm

и должен работать правильно.

Другие вопросы по тегам