Библиотека включает пути с одинаковым именем заголовка

каков наилучший способ включить файл с тем же именем в другую папку из дополнительных каталогов 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, чтобы избежать таких путаниц.