2015-10-06 3 views
0

У меня есть файл makefile, который успешно создает * .obj-файлы. После того, как я дойду до связующей части, у меня есть много ошибок до undefined reference.C++ makefile - linker не найти внешнюю библиотеку

CC = g++ 

INCLUDE_DIRS = -I/usr/include/freetype2/ -I../MyLibs/ \ 
       -I../MyLibs/svg/ 

LIB_DIRS = -L./ -L../MyLibs/ -L/usr/lib64/ -L/usr/lib64/mysql/ 

LIBS = -lMyUtils -lfreetype -lmysqlclient -lsqlite3 


CFLAGS = -std=c++11 -lm -lpthread -lstdc++ -ldl -Wall -O2 \ 
     $(INCLUDE_DIRS) 

OBJ = *** list of obj files *** 

BIN = my_program 

$(BIN): $(OBJ) $(OBJ) 
    $(CC) $(CFLAGS) $(LIB_DIRS) $(LIBS) $^ -o [email protected] 

Я не могу видеть, что может быть неправильным. MyUtils - это статическая библиотека, которую я также создаю с использованием другого make-файла (если я смотрю внутри с ar, я вижу все присутствующие объекты). Кроме того, я использовал одну и ту же библиотеку для создания другого проекта (динамической библиотеки), и сборка была правильно завершена.

A am using gcc 4.7.2 под CentOS 6.5.

+0

Для меня '$ (CFLAGS) $ (LIB_DIRS) $ (LIBS)', когда первый и третьи переменные содержат параметр '-l', но вторая переменная содержит' -L' выглядит подозрительно. Можете ли вы попробовать '$ (LIB_DIRS) $ (CFLAGS) $ (LIBS)'? – Gluttton

+0

@Gluttton Я переместил все -l вместе и все -L, но проблема остается –

+0

Странно перечислить '$ (OBJS)' дважды в списке зависимостей для '$ (BIN)'. Я не знаю, вызвало бы это проблемы компиляции, но это, вероятно, вызовет проблемы с ссылками. – nobar

ответ

4

Ваш рецепт компоновщика помещает библиотеки перед требуемыми объектными файлами. Линкером будет только проверять библиотеку, чтобы разрешить неопределенные ссылки, которые уже отмечались в ранее связанных объектах, , поэтому, если вы поместите все библиотеки перед всеми объектными файлами, тогда ни одна из библиотек не проверит и все вызовы этих библиотек в объектные файлы в конечном итоге не определены.

Rewrite, например, как:

$(BIN): $(OBJ) 
    $(CC) $(CFLAGS) $^ $(LIB_DIRS) $(LIBS) -o [email protected] 

(и нет необходимости дублировать $ (OBJ) prerequisities)

+0

Еще проще: скопируйте правило ссылки по умолчанию из 'make -f/dev/null -print-data-base', а именно' $ (LINK.cc) $^$ (LOADLIBES) $ (LDLIBS) -o $ @ ' (и поместите ваш '$ (LIB_DIRS)' в стандартный '$ (LDFLAGS)'). –