Включая заголовок из родительского каталога - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть ситуация, когда мне дают ссылку на исходный каталог, который идет под родительским каталогом. Содержание ссылки не может быть изменено. Ссылка имеет заголовок и файл. c. Заголовочный файл содержит файл «Config.h». Config.h может находиться только в родительском каталоге, потому что я не могу ничего изменить по ссылке. Я должен использовать источники в ссылке и скомпилировать родительский каталог. Вот структура каталогов.

ParentDir
    |-TestSrc.c
    |-TestSrc.h
    |-Config.h
    |-Makefile
    |-LinkToSrcDir
           |-Src.c
           |-Src.h(#include "Config.h")

Мой make-файл очень прост

CC = gcc
INC_DIR = -IParentDir -IParentDir/LinkToSrcDir
CFLAGS = -Wall -Wextra $(INC_DIR)

all: mybin
mybin: TestSrc.o Src.o
       $(CC) $(CFLAGS) -o TestSrc.o Src.o
TestSrc.o: TestSrc.c
       $(CC) $(CFLAGS) -c TestSrc.c
--- similar code for Src.o ----
Phony: clean (all the usual rm -f)

Моя проблема в том, что я не могу изменить sr c .h, make всегда жалуется, что Config .h не найден (пробовал несколько разных способов). Как мне написать Makefile, чтобы sr c .h искал Config.h в родительском каталоге?

1 Ответ

0 голосов
/ 20 апреля 2020

Самый простой способ - использовать полный путь для флагов компилятора:

INC_DIR = -I$(CURDIR)/ParentDir -I$(CURDIR)/ParentDir/LinkToSrcDir

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

С G CC руководство , например:

препроцессор ищет включенные заголовочные файлы ... сначала относительно каталога текущего файла

В вашем случае текущий файл равен LinkToSrcDir/Src.h, поэтому все пути будет развернут относительно каталога LinkToSrcDir.

Когда вы говорите ссылку выше, я предполагаю, что вы имеете в виду ссылку symboli c. В этом случае вы, возможно, не сможете использовать что-то вроде -I.., потому что это даст вам родителя каталога, с которым вы связаны.

У вас почти нет другого выбора, кроме как использовать полный путь в вашем -I вариантов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...