Я запускаю g++ в системе Linux, где мои стабильные файлы заголовков существуют в директории /inc только для чтения, и одна из них, в которой я работаю, находится в /inctest. В результате этого в обоих каталогах может существовать одно и то же имя файла. Я хочу иметь возможность сохранить его таким образом, чтобы я всегда включал любые заголовки, присутствующие в /inctest, прежде чем они будут включены из /inc.
Проблема, с которой я сталкиваюсь, заключается в том, что в разное время она, как кажется, произвольно берет из любого из этих каталогов, а не всегда одну и ту же.
То есть, я запускаю g++ -I/inctest -I/inc a.cpp b.cpp...
и иногда я получаю один из /inc, иногда я получаю один из /inctest.
Является ли заказ, что мои -I параметры указаны неактуальными? На странице руководства для g++ говорится: "Заказ имеет значение, если вы используете несколько вариантов одного и того же типа".
Есть ли какой-либо другой способ, который я могу гарантировать всегда, включая заголовки из одного каталога перед их же именованным партнером в другом каталоге? Мне все равно нужно включить оба, поскольку /inc содержит все заголовки, над которыми я сейчас не работаю. Переименование тех, над которыми я работаю, не помогает, потому что тогда мне нужно изменить все мои #includes...
Редактирование: я немного углубился и заметил, что заголовок в /inc содержит другой заголовок, который существует как в /inc, так и в inctest. Я скопировал этот заголовок временно /inctest и, конечно же, включил его правильно. Это ошибка или правильное поведение?
Точные местоположения заголовков не указаны стандартом, и, как правило, компиляторы несколько слабы, чтобы документировать, что используется. -I
обычно используются для заголовков, не найденных локально для файла, включая что-то. Тем не менее, при включении файла другой заголовок, выбранный файл обычно зависит от того, как файлы включаются:
#include <xxx>
в заголовке -I
флаги -I
.#include "xxx"
в заголовке файл сначала просматривается в каталоге, где находится файл с директивой #include
. Конечно, проблема состоит в том, что, строго говоря, форма <xxx>
зарезервирована для использования стандартной библиотеки.
#include <xxx>
и#include "xxx"
как описано здесь: gcc.gnu.org/onlinedocs/cpp/Include-Syntax.html