makefile — файл ввода компоновщика не используется c ++ g ++ make file

Я не могу понять, что является причиной этой ошибки, которую я продолжаю получать при создании моего проекта:

i686-apple-darwin11-llvm-g++-4.2: -lncurses: linker input file unused because linking not done

И мой make-файл выглядит так:

CC = g++

LIB_FLAGS = -l ncurses

FLAGS = $(LIB_FLAGS)

DEPENDENCIES = window.o element.o

# FINAL OUTPUTS
main: main.cpp $(DEPENDENCIES)
$(CC) $(FLAGS) -o main.out main.cpp $(DEPENDENCIES)

# MODULES
window.o: main.h classes/window.cpp
$(CC) $(FLAGS) -c classes/window.cpp

element.o: main.h classes/element.cpp
$(CC) $(FLAGS) -c classes/element.cpp

# CLEAN
clean:
rm -rf *.o
rm main.out

Все компилируется нормально, но мне просто интересно, что вызывает это сообщение об ошибке и что оно означает ..

4

Решение

Не указывайте флаги ссылок при компиляции (-c flag) ваших исходных файлов. Взгляните на этот пример makefile (очень похож на make-файл docs)

CPP = g++
CPPFLAGS =-Wall -g
OBJECTS = main.o net.o
PREFIX = /usr/local

.SUFFIXES: .cpp .o

.cpp.o:
$(CPP) $(CPPFLAGS) -c $<

.o:
$(CPP) $(CPPFLAGS) $^ -o $@

main: $(OBJECTS)
main.o: main.cpp
net.o: net.cpp net.h.PHONY:
install: main
mkdir -p $(PREFIX)/bin
rm -f $(PREFIX)/bin/main
cp main $(PREFIX)/bin/mainclean:
rm -f *.o main
4

Другие решения

Вы передаете опции компоновщика в вызов компилятора вместе с -c, что означает, что связывание не выполняется и тем самым -l варианты не используются. В вашем случае ваш LIB_FLAGS не должно быть в FLAGS, но вместо этого указано в main: ... правило:

main: main.cpp
$(CC) $(FLAGS) $(LIB_FLAGS) ...
5

Как уже упоминалось, вы передаете флаги, связанные с компоновщиком, на этапе компиляции. Обычно вам нужны разные флаги для компиляции и компоновки, например,

CC = g++

CPPFLAGS = -Wall -g -c -o $@

LDFLAGS = -l ncurses -o $@

DEPENDENCIES = main.o window.o element.o

# FINAL OUTPUTS
main: $(DEPENDENCIES)
$(CC) $(LDFLAGS) $(DEPENDENCIES)

# MODULES
main.o: main.h main.cpp
$(CC) $(CPPFLAGS) main.cpp

window.o: main.h classes/window.cpp
$(CC) $(CPPFLAGS) classes/window.cpp

element.o: main.h classes/element.cpp
$(CC) $(CPPFLAGS) classes/element.cpp

# CLEAN
clean:
-rm main $(DEPENDENCIES)
3