Вы, кажется, имеют следующую структуру:
whatever/
list/
...
list.h
...
queue/
... <- some files have an #include "list/list.h";
list/ <- duplicate
tree/
rootedTree/
...
list/ <- duplicate
tree.h <- has an #include "list/list.h";
test.c <- #include "tree.h"
В этом коде, вы сначала перейдите в папку, в которой вы хотите собрать вещи, а затем собрать их в папку:
[email protected]:~/whatever/tree/rootedTree$ gcc -Wall -I. -g *.c -o test
Пути операторов #include
относятся к тому, где вызывается компилятор от (до тех пор, пока вы включаете аргумент -I.
; спасибо, @ jean-françois-fabre). Таким образом, вы можете очень хорошо иметь следующие (не дублированные) структуры:
whatever/
list/
...
list.h
...
queue/
... <- some files have an #include "list/list.h"; no list/ duplicate
tree/
rootedTree/
...
tree.h <- has an #include "list/list.h"; no list/ duplicate
testTree.c <- #includes "tree/rootedTree/tree.h" and others
и из папкинезависимо, вы можете написать
[email protected]:~/whatever$ gcc -Wall -I. -g */*.c testTree.c -o testTree
и получить исполняемый файл для тестирования , Поскольку непосредственный вызов компилятора является скучным, особенно если вы хотите только скомпилировать части кода, где вы действительно вносили изменения, вы обычно используете какой-то файл определения проекта (Makefile, Scons, ...), чтобы обрабатывать это для вас ,
Дублирование плохое, и есть (почти) всегда способ избежать этого.
Итак, как '#include" List/List.h "' работает в вашем ответе? Как препроцессор ('cpp') находит код, когда вы говорите' List/List.h'? '*/*. c' - это всего лишь код c во всех дочерних папках, но не файлы заголовков. Можете ли вы уточнить? – overexchange
Когда компилятор обнаруживает #include, он пытается прочитать связанный файл из своего текущего рабочего каталога. Если я запустил gcc из 'whatever /', тогда gcc может корректно читать 'List/list.h', когда сталкивается с' #include 'List/list.h "в, например,' Tree/tree.h'. – tucuxi
Но папка списка не должна находиться в папке дерева, чтобы избежать дублирования. – overexchange