2017-02-08 30 views
0

Я загрузил и построил FLTK (версия 1.3.4.1), используя MingW и cmake, которые отлично работали. Однако у меня возникают проблемы с правильной привязкой к FLTK, что приводит к множеству неопределенных ссылок при связывании. У меня нет MSYS или любой другой оболочки для Windows, которая означает, что использование скрипта «fltk-config» не является вариантом.Как подключиться к библиотекам при использовании MingW и make-файлов

Мои знания о make-файлах довольно скудны, и следующее было построено с использованием официальной документации и различных интернет-источников.

CC=g++ 
FLTK_INC=C:/frameworks/fltk-1.3.4-1 
FLTK_BIN=C:/frameworks/fltk-1.3.4-1/bin 
CFLAGS=-std=c++11 -Wall -I$(FLTK_INC) -v 
LDFLAGS=-L$(FLTK_BIN)/lib 
LDLIBS=-lfltk 
EXT=cc 
SOURCES=$(wildcard src/*.$(EXT)) 
OBJECTS=$(SOURCES:.$(EXT)=.o) 
EXECUTABLE=hello 

all: $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] 

.$(EXT).o: 
    $(CC) $(CFLAGS) $< -o [email protected] 

Есть ли что-то явно не так с этим make-файлом или ошибка лежит где-то еще?

ответ

0

Есть ли что-то явно неправильное в этом make-файле или же ошибка лежит где-то еще?

В этом make-файле есть две вещи.

Вещь 1

LDFLAGS=-L$(FLTK_BIN)/lib 
LDLIBS=-lfltk 

Вы обычный GNU Make настройки опций подъёмник:

LDFLAGS=-L$(FLTK_BIN)/lib 

$(LDFLAGS) должно происходить в соответствующем положении в рецепте связи сказать компоновщик, что он следует искать в каталоге $(FLTK_BIN)/lib для любых библиотек, указанных в параметре -l (bef руда поиск в своих каталогах по умолчанию).

LDLIBS=-lfltk 

$(LDLIBS) должно происходить в соответствующем положении в рецепте связи сказать компоновщик, что он должен связать общую библиотеку libfltk.so или если это невозможно, статическую библиотеку libfltk.a. (В Windows принимаются другие расширения ).

Ваш рецепт связь:

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] 

имеет $(LDFLAGS) в соответствующем положении, но не имеет $(LDLIBS) в любом месте. Поэтому компоновщик не пытается связать libfltk. Скорее всего, это объясняет неопределенные ссылочные ошибки, о которых вы говорите, , хотя я не могу быть абсолютно уверен, так как вы не обнаружили, что они собой представляют.

Соединительное рецепт должен быть:

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] $(LDLIBS) 

или более традиционно:

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $^ -o [email protected] $(LDLIBS) 

Thing 2

Ваш рецепт компиляции:

.$(EXT).o: 
    $(CC) $(CFLAGS) $< -o [email protected] 

на самом деле не рецепт компиляции. Это рецепт компиляции и ссылки. gcc/g++ всегда будет пытаться выполнить привязку, если параметры командной строки не включают -c (= только компиляция). Так как рецепт (правильно) не содержит , любой из необходимых вариантов связи - $(LDFLAGS), $(LDLIBS) - неудачная попытка соединения не удалась, и сборка не дошла. командной строки вы вошли как продуцирование ошибки сцепления:

g++ -std=c++14 -Wall -IC:/frameworks/fltk-1.3.4-1 -v src/hw.cc -o src/hw.o 

подмены экземпляр вашего «компилировать» рецепт:

$(CC) $(CFLAGS) $< -o [email protected] 

и не рецепт сцепления:

$(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] 

Чтобы исправить рецепт компиляции, сделайте это:

$(CC) $(CFLAGS) $< -c -o [email protected] 

The GNU Make documentation хорошее.

+0

Последующие ваши разумные советы, но ошибок по-прежнему изобилует. См. [Link] (http://pastebin.com/2tr3CuRg) –

+0

@slimandstacked Пожалуйста, опубликуйте полный вывод ошибки, а не только ошибки. –

+0

[Журнал] (http://pastebin.com/xr8GjcX6) –