2016-02-22 4 views
0

Я пытаюсь написать то, что, как я думал, будет довольно простым Makefile, и я просто озадачен! Я не автор сценариев, но я думал, что понял их достаточно, чтобы иметь возможность работать простым.Борьба с GCC Makefile

Хорошо, у меня есть небольшой проект в каталоге, а также в этом каталоге есть каталог libs, содержащий много файлов .c. То, что я пытаюсь сделать, это написать make-файл, который будет создавать содержимое каталога/libs в статический файл lib в каталоге/libs, а затем скомпилировать несколько исходных файлов в каталоге/и связать его со встроенным .a файл.

Я уверен, что кто-то собирается предложить «почему бы не использовать CMake», но это не ответ я ищу (волны рукой, как джедай .. ehehehehe)

CC = gcc 
CFLAGS = -Wall 
SOURCES = lzx.c csum.c dirs.c listner.c tree.c 
OBJECTS = $(SOURCES:.c=.o) 
TARGETLIB = libs/mylib.a 
TARGET = TestApp 

libs/%.o : libs/%.c 
    $(CC) $CFLAGS -c $< 

$(TARGETLIB) : $(OBJECTS) 
    ar rcs [email protected] $^ 

$(TARGET) : 
    $(CC) $CFLAGS Source1.cpp Source2.cpp -llibs/mylib.a -o [email protected] 

Мое понимание было то, что первый рецепт, скомпилировал бы все .c-файлы в объекты, но, похоже, скомпилировал первый .c-файл, а затем остановился.

Любая помощь, которую кто-либо мог бы дать мне, будет оценен по достоинству.

+0

См. [This] (http://stackoverflow.com/a/16751650/841108) & [that] (http://stackoverflow.com/a/26689798/841108) примеры. Используйте недавний 'make' с' make -trace' или [remake] (http://bashdb.sourceforge.net/remake/) '-x'. Используйте $ ([patsubst] (https://www.gnu.org/software/make/manual/html_node/Text-Functions.html) ...); или иметь внутренний 'libs/Makefile' и использовать' $ (MAKE) -C libs' –

+0

Спасибо Базиле, но я уже посмотрел на эти примеры, и хотя они близки, они не совсем делают то, что я пытаясь сделать. Моя основная проблема заключается в% .o:% .c, который в моей голове должен скомпилировать все .c-файлы в каталоге libs /, но на самом деле только компилирует первый файл в списке, а затем сбой по какой-либо причине, которую я не могу объяснить. make -trace - хорошая идея. –

+0

Итак, 'libs /' содержит 'lzx.c csum.c dirs.c listner.c tree.c', и те файлы, которые вы хотите скомпилировать и объединить, чтобы сформировать' libs/mylib.a', правильно? – Beta

ответ

2

Поскольку ваше окончательное приложение TARGET, вы должны сделать его первым правилом Makefile. А так как это также зависит от TARGETLIB она должна быть задана как зависимость, например, так:

$(TARGET): $(TARGETLIB) 
    $(CC) $(CFLAGS) Source1.cpp Source2.cpp -Lmylib -o [email protected] 

рядом я предполагаю, что * .c файлы Вы упомянули Lib файлы. Таким образом вам понадобится префикс, поскольку вы хотите указать их вручную, а не с помощью подстановочных знаков или правил.

OBJECTS = $(addprefix(libs, $(SOURCES)):.c=.o) 

и последнее, что приходит на ум это имя библиотеки, которая должна быть libSOMENAME.a (ну, компоновщик ищет это имя в пути и -Lotherpaths). Итак, мы имеем:

TARGETLIB = libs/libmylib.a 

подводя итоги:

CC = gcc 
CFLAGS = -Wall 
SOURCES = lzx.c csum.c dirs.c listner.c tree.c 
OBJECTS = $(addprefix(libs, $(SOURCES)):.c=.o) 
TARGETLIB = libs/libmylib.a 
TARGET = TestApp 

$(TARGET) : $(TARGETLIB) 
    $(CC) $(CFLAGS) Source1.cpp Source2.cpp -static -L./libs -lmylib -o [email protected] 

$(TARGETLIB) : $(OBJECTS) 
    ar rcs [email protected] $^ 

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

+0

Благодарим вас за советы и помощь, и это правда, я мог потратить гораздо больше времени на изучение руководства, а не задавать здесь свои вопросы. Я скорее надеялся, что это будет пять минут, а не так сложно. Я попытался адаптировать примеры, которые я нашел в Интернете, но теперь очевидно, что некоторые из моих предубеждений в make-файлах просто ошибаются. –

Смежные вопросы