Знает ли «make», как искать вложенные папки для включаемых файлов? - PullRequest
2 голосов
/ 07 июля 2010

Это вопрос к опытным разработчикам C / C ++.

У меня нет знаний о компиляции программ на C с помощью команды "make", и мне нужно изменить существующее приложение, т.е.измените его файлы "config" и "makefile".

.h. Файлы, которые нужны приложению, находятся не в одноуровневом каталоге, а, скорее, они распределены по нескольким подкаталогам.

Чтобы cc мог найти все необходимые файлы для включения, могу ли я просто добавить один ключ "-I", чтобы указать cc в каталоге верхнего уровня, и ожидать, что он будет рекурсивно искать все подкаталоги, или я должен добавитьнесколько переключателей "-I" для точного перечисления всех подкаталогов, например.-I / usr / src / myapp / includes / 1 -I / usr / src / myapp / includes / 2 и т. Д .?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 07 июля 2010

Этот вопрос, похоже, касается драйвера компилятора C, а не make.Предполагая, что вы используете GCC, вам нужно перечислить каждый каталог, который вы хотите найти:

gcc -I/foo -I/foo/bar myprog.c
1 голос
/ 07 июля 2010

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

gcc (...)

но

$(CC) $(CFLAGS) (...)

и если это так, и вам повезло, вам даже не нужно редактировать ни один из make-файлов; вместо этого вы можете вызвать make как это

make CFLAGS='-I /absolute-path/to/wherever'

для включения ваших специальных параметров в вызов компилятора.

Также проверьте, не генерируются ли Make-файлы чем-то другим (обычно это скрипт в верхнем каталоге с именем

configure

, который будет иметь свои собственные опции для управления тем, что входит в них).

1 голос
/ 07 июля 2010

Это на самом деле переключатель компилятора, не имеющий отношения к самому себе.

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

Например, если у вас есть

#include "my/path/to/file.h"

и вы дадите -I a/directory в качестве параметра, компилятор будет искать a/directory/my/path/to/file.h.

0 голосов
/ 05 мая 2011

все правильно ответили на ваш вопрос. но кое-что следует учитывать, когда вы настраиваете свое собственное дерево исходных текстов… конечный узел должен искать заголовки только в 2 местах, в своем собственном каталоге или в дереве. как только люди начнут переходить на одноранговые узлы и спускаться по дереву, система сборки станет довольно сложной, но также случается, что люди начинают использовать частные интерфейсы, когда они должны использовать открытые интерфейсы

...