Библиотека включает пути с тем же именем заголовка - PullRequest
16 голосов
/ 02 марта 2011

Каков наилучший способ включить файл с таким же именем в другую папку из дополнительных каталогов include?

Пример:

lib1/include/foo.h
lib2/include/foo.h

, где и lib1 / include и lib2 / includeдобавляются в дополнительные каталоги include.

Редактировать:

Прилагаются библиотеки разных SDK, и каждый разработчик устанавливает их на своем месте.Единственное, что точно, так это то, что обе папки в IDE включены в дополнительные пути включения

метод 1:

#include "../../lib1/include/foo.h

method2:

Добавить lib1 /include перед lib2 / include в путях поиска и потому что они ищутся в следующем порядке:

#include "foo.h"

lib1 / include / foo.h будет включен

Ответы [ 5 ]

8 голосов
/ 02 марта 2011
#include "lib1/include/foo.h"
#include "lib2/include/foo.h"

Хорошо, если это фактический относительный путь к этим заголовкам, а включающие охранники различны. Например, если оба foo.h используют

#ifndef _foo_h_

тогда это даст вам то, что вы не хотите (оно будет включать только одно, а не оба, и то, что зависит от порядка исполнения).

5 голосов
/ 02 марта 2011

Вы можете просто сделать это:

#include "lib1/include/foo.h"
#include "lib2/include/foo.h"

и убедитесь, что родительские каталоги lib1 и lib2 находятся в вашем пути поиска включений (но не самих фактических include подкаталогов).

Обратите внимание, что если оба заголовка используют один и тот же символ в качестве защитного ключа включения, этот метод не будет работать - вам нужно будет определить конфликтующий символ между этими двумя символами:

#include "lib1/include/foo.h"
#undef FOO_H
#include "lib2/include/foo.h"
4 голосов
/ 26 августа 2014

Интересно, что с 4 ответами и 1709 взглядами в настоящий момент еще никто не советовал такое простое и понятное решение.

Вы можете включать файлы по своему усмотрению, единственная реальная проблема, с которой вы столкнетесь, - это примерно одинаковые заголовки. Итак, вы должны создать заголовок, который будет включать оба конфликтующих заголовочных файла. Давайте назовем это inc_foo_lib1_lib2.h. В этом файле вы включаете первый foo.h, затем, если был определен защитный заголовок, отмените его, затем включите второй 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"
4 голосов
/ 02 марта 2011

Во-первых, в этом ответе предполагается, что защитные элементы для двух заголовков совместимы (т. Е. Не совпадают символы).

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

1 голос
/ 02 марта 2011

Я бы включил файлы из однозначного каталога, который находится в списке -I (то есть путь к каталогу, который содержит lib1 и lib2):

#include "lib1/include/foo.h"
#include "lib2/include/foo.h"

Поэтому будетнет никакой двусмысленности, потому что прекомпилятор будет смотреть на lib1/include/foo.h в своем списке каталогов, и это происходит не из lib1/include/ или lib2/include/, а только из родительского каталога.охраняет, даже если для заголовка lib, имя должно включать имя lib, чтобы избежать таких недоразумений.

...