Jump to content

    

Вопрос по #include

Использую IAR 7.80.4.

При работе с новым проектом решил использовать несколько исходников от старого проекта. Соответственно включил их в новый проект.
Но физически файлы остались в каталогах старого проекта.
В этих файлах есть строки типа:
#include "define.h", где настраивается функционал.
Соответственно нужные хидеры в новом проекте лежат в каталоге, который прописан в путях проекта в опциях "include".
И я предполагал, что они будут взяты именно оттуда.
Но выяснилось, что в каталоге, где находится подключаемый "*.c", лежит хидер с таким же именем.
При компиляции был подключен файл из старого проекта, а не из нового (молча).
Когда доступный хидер из старого проекта был переименован, то также молча был найден и подключен хидер уже из нового проекта.

Естественно, что каталог, где находится подключаемый "*.c", в новом проекте нигде не упоминается.

Вышел из положения, скопировав нужные файлы в новый проект, но это вроде как не совсем правильно.

Что скажете, так и должно быть?

Share this post


Link to post
Share on other sites

Компилятор ищет инклуды сперва в текущем каталоге, затем в наборе, указанном в опциях компилятора "include directoried" (не помню точно).

Или, если путь указан сразу в #include "C:\MyDir\MyFile.h" - то там.

Если файл не в кавычках, а в < > - поиск ведется в системных (IARа) каталогах.

Если хотите включить конкретные (или с макро-перемнными) пути, см. опции проекта, C/C++compiler, preprocessor, additional include directories.

Если в проекте обязательно должны использоваться файлы с одним и тем же именем, укажите для каждого из них индивидуальные пути загрузки, или - "научите" каждый из них грузиться (или не грузиться) с помощью #ifdef.

Если один и тотже код используется в нескольких проектах, его можно скомпилировать в библиотеку, или вынести каталог с этим кодом из каталога проекта на один уровень выше. В каждом проекте можно указать относительный стандартный путь поиска к нему, как ..\MyLib\

\MyWorks\

    \Proj1

    \Proj2

    \MyLib

 

Share this post


Link to post
Share on other sites
3 часа назад, amiller сказал:

Вышел из положения, скопировав нужные файлы в новый проект, но это вроде как не совсем правильно.

Так лучше.

Share this post


Link to post
Share on other sites
9 часов назад, k155la3 сказал:

Компилятор ищет инклуды сперва в текущем каталоге, затем в наборе, указанном в опциях компилятора "include directoried" (не помню точно).

Или, если путь указан сразу в #include "C:\MyDir\MyFile.h" - то там.

Если файл не в кавычках, а в < > - поиск ведется в системных (IARа) каталогах.

Если совсем точно, то #include "" ищется сперва в директории, где находится исходный файл, содержащий директиву включения, а затем по всем остальным путям, указанным компилятору в качестве поисковых для включаемых файлов (обычно это опция командной строки -I ...). А #include <> ищется разу по поисковым путям, минуя директорию текущего исходного файла. Такое разделение сделано для оптимизации поиска: библиотечные заголовки как правило лежат по своим путям и поэтому нет смысла их искать в директориях проекта, поэтому такие файлы лучше заключать в <>. А заголовки проекта как правило лежат прямо тут же рядом с с/срр файлами, поэтому их надо заключать в "".

Share this post


Link to post
Share on other sites
1 hour ago, dxp said:

Если совсем точно, то #include "" ищется сперва в директории, где находится исходный файл, содержащий директиву включения, а затем по всем остальным путям, указанным компилятору в качестве поисковых для включаемых файлов (обычно это опция командной строки -I ...). А #include <> ищется разу по поисковым путям, минуя директорию текущего исходного файла. Такое разделение сделано для оптимизации поиска: библиотечные заголовки как правило лежат по своим путям и поэтому нет смысла их искать в директориях проекта, поэтому такие файлы лучше заключать в <>. А заголовки проекта как правило лежат прямо тут же рядом с с/срр файлами, поэтому их надо заключать в "".

Спасибо всем.
Я всегда думал, что <> означают поиск в системных каталогах.
Но если это позволяет исключить каталог, где находится текущий файл, то это как раз то, что мне нужно.

Share this post


Link to post
Share on other sites
12 hours ago, jcxz said:

Так лучше.

+1.

Смешивать разные проекты в кучу себе дороже. Заимствования из других проектов правильнее делать средствами системы контроля версий. Например, в SVN есть такая штука - externals. То, что доктор прописал.

Share this post


Link to post
Share on other sites
11 hours ago, dxp said:

Если совсем точно, . . .

Спасибо за инф. Не приходилость (по причине отсутствия необходимости) досконально изучать.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this