Библиотека включает пути с одинаковым именем заголовка
каков наилучший способ включить файл с тем же именем в другую папку из дополнительных каталогов include?
пример:
lib1/include/foo.h
lib2/include/foo.h
где lib1 / include и lib2/include добавлены в дополнительные каталоги include.
Edit:
библиотеки из разных SDK, и каждый разработчик устанавливает их на своем месте. Единственное, что точно, что обе папки находятся в дополнительных IDE, включают пути
Способ 1:
#include "../../lib1/include/foo.h
метода Method2:
добавить lib1 / include перед lib2 / include в пути поиска и потому, что они ищутся в порядке:
#include "foo.h"
lib1 / include / foo.h будет включен
5 ответов
во-первых, этот ответ предполагает, что охранники include для двух заголовков совместимы (т. е. не те же символы).
одна вещь, которую вы можете сделать, это создать ссылки в известных местах в заголовочных файлах, представляющих интерес, давая сами ссылки различные имена. Например, предположим, что ваши две библиотеки установлены в $LIB1PATH и $LIB2PATH, которые могут иметь разные значения в разных средах сборки. Таким образом, заголовки, которые вы хотите получить, находятся в $LIB1PATH/include/foo.h и $LIB2PATH / include / foo.h.
вы можете пойти двумя путями с этим. Один из них-создание прямых ссылок. Это может выглядеть так в дереве каталогов проекта:
$PROJDIR/
include/
lib_include/
lib1_foo.h -> $LIB1PATH/include/foo.h
lib2_foo.h -> $LIB2PATH/include/foo.h
src/
это может быть сложно, если ваш код находится в репозитории, потому что вы не можете проверить эти ссылки; они будут неправильными в других средах. Кроме того, если у вас много этих ссылок и мало библиотек, вам придется воссоздавать их все при каждом перемещении lib1 или lib2... не круто. Ты можешь обойти это. проблема создания ссылок в каталоге, содержащем каталог проекта:
$PROJDIR/
include/
lib_include/
lib1_foo.h -> ../../lib1/include/foo.h
lib2_foo.h -> ../../lib2/include/foo.h
src/
lib1 -> $LIB1PATH/
lib2 -> $LIB2PATH/
в обоих случаях вам нужно убедиться $PROJDIR/lib_include
на вашем пути. Кроме того, вам нужно только иметь $LIB1PATH/include
и $LIB2PATH/include
в вашем пути включения, если два foo.h
заголовки вытягивают больше заголовков из этих каталогов. Вы также можете поместить ссылки в include
и избавиться от lib_include
, но мне нравится держать эти вещи отдельно.
#include "lib1/include/foo.h"
#include "lib2/include/foo.h"
отлично, если это фактический относительный путь к этим заголовкам и включить охранников разные. Например, если оба foo.ч использовать
#ifndef _foo_h_
то это даст вам то, что вы не хотите (он будет только один, а не оба, а какой зависит от порядка выполнения).
вы можете просто сделать это:
#include "lib1/include/foo.h"
#include "lib2/include/foo.h"
и убедитесь, что родительские каталоги обоих lib1
и lib2
находятся в вашем пути поиска для includes (но не фактический include
сами подкаталоги).
обратите внимание, что если оба заголовка используют тот же символ, что и Include guard, то этот метод не будет работать - вам нужно будет определить конфликтующий символ между ними:
#include "lib1/include/foo.h"
#undef FOO_H
#include "lib2/include/foo.h"
интересно, что с 4 ответами и 1709 взглядами на данный момент никто еще не посоветовал такое простое и простое решение.
вы можете включать файлы, как хотите, единственная реальная проблема, с которой вы столкнетесь, - это примерно те же заголовки guard. Таким образом, вы должны создать заголовок, который будет включать в себя оба конфликтующих файла заголовка. Назовем это inc_foo_lib1_lib2.h
. В этот файл вы включаете Первый foo.h
, затем, если заголовок guard был определен undefine, далее включить второй foo.h
.
в качестве примера предположим, что foo.h
есть защита заголовка FOO_H_INCLUDED
, тогда как inc_foo_lib1_lib2.h
выглядит так:
#include "lib1/foo.h"
#ifdef FOO_H_INCLUDED
#undef FOO_H_INCLUDED
#else
COMPILATION ERROR — the header guard was changed!
#endif //FOO_H_INCLUDED
#include "lib2/foo.h"
Я бы включил файлы из однозначного каталога, который находится в -I
list (то есть путь к каталогу, который содержит lib1 и lib2):
#include "lib1/include/foo.h"
#include "lib2/include/foo.h"
поэтому не будет никакой двусмысленности, потому что precompiler будет смотреть на lib1/include/foo.h
в своем списке каталогов, и это не происходит из lib1/include/
или lib2/include/
но только из родительского каталога.
как сказано ранее: позаботьтесь о охранниках, даже если для заголовка lib имя должно включите имя lib, чтобы избежать таких путаниц.