2013-12-06 3 views
1

У меня есть один вопрос о компиляции исходного файла c в файл obj. ситуация такова: у меня есть исходный код от поставщика, какой-то lib от поставщика и некоторый obj-файл от поставщика.скомпилировать исходный код c в файл obj

Makefile, обеспечивают по поставщикам, а также, и использовать следующий способ определить источник:

${BUILD_LIB}_FILES += a.c \ 
b.c \ 
c.c 

Эти три C-файлы должны сначала компилировать в OBJ файл, а затем генерировать Lib файл. Тем не менее, поставщик НЕ выпустил мне файл c.c, он предоставил мне только c.o, это означает, что я сначала скомпилирую a.c и b.c в файл obj и использую их вместе с c.o для генерации файла lib, но как это может быть сделано makefile?

Запутанная точка находится в Makefile, это уже список c.c должна быть в процессе компиляции (это добавить c.c в переменные $ {BUILD_LIB} _FILES), но если марка может найти там предварительно построить c.o, он не будет компиляция c.c (это значит для моей ситуации, независимо от того, что есть c.c или нет, она скомпилируется успешно), ПОЧЕМУ? Из моего понимания, gcc должен скомпилировать ВСЕ исходные файлы, которые уже перечислены в этой переменной.

+0

Ответ на ваш вопрос зависит от другого содержимого make-файла, которое вам нужно будет показать. – Armali

ответ

0

Одной из особенностей make заключается в том, что он не будет перестраивать уже построенный код. В вашем случае файлы исходного кода C не будут скомпилированы, потому что для этих файлов уже существует объектный файл. make видит, что ему нужно построить a.c, b.c и c.c и ищет a.o, b.o и c.o. Поскольку поставщик предоставил те a.o, b.o и c.o, он не пытается скомпилировать a.c, b.c и c.c, поскольку он считает, что они уже скомпилированы.

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

+0

благодарю, я вижу, нет ли файла c и obj, makefile не будет его компилировать –

-3

Как показано в gcc command-line, опция -c может использоваться для предотвращения соединения gcc. Как только вы получите свой выход, вы можете использовать команду ld, чтобы получить окончательный вариант a.out.

Например:

GCC -c -o ab.o ас Ьс

Л.Д. -o a.out -lc ab.o совместно

+1

Вы понимаете, что ссылка, размещенная вами, упоминает, что '-C: не отбрасывать комментарии. Все комментарии передаются в выходной файл, за исключением комментариев в обработанных директивах, которые удаляются вместе с директивой. ... ' – devnull

+0

Неверно: соответствующая опция' gcc' (во избежание связывания) находится в нижнем регистре 'gcc -c' (* not *' -C' !!); и использование 'gcc -Wall -g -c' полезно ... –

+0

@devnull Редактировать. – suitianshi

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