2013-02-12 4 views
4

Я работаю над базой кода, которая использует библиотеки boost. Но у меня недавно возникли проблемы с созданием базы на машине нового пользователя. Я смог решить проблему следующим образом. Вот как система сборки выглядит следующим образом:Задание включить путь для повышения в одном месте только в g ++

/root 
    /SubModules_with_Makefiles_and_Code 
    /thirdparty/boost 

Код подмодуль будет ссылаться повысить такие вещи, как так (например):

#include <boost/property_tree/ptree.hpp> 

И модуль к югу сделать файлы будут создавать такой код, как так (например):

g++ -c -o code.o code.cpp -I/root/thirdparty/boost 

Наша сторонняя библиотека ускорения - версия 1.37. Однако некоторые модули начали использовать более поздние версии boost. Эта проблема была замаскирована, потому что машины, на которых были построены эти модули, содержат boost 1.41, установленный в/usr/include/boost.

Проблема возникла из-за того, что на машине нового пользователя не было установленного 1.41 в/usr/include. В идеале я бы хотел, чтобы g ++ искал повышение в стороннем каталоге и больше нигде. Таким образом, мы можем более точно контролировать, как создается база кода.

-I < dir> места < dir> до того, как система включит во время поиска, но системные компоненты по-прежнему смотрятся, и именно здесь могут быть установлены более поздние версии boost, зависящие от машины. Я могу подавить взгляд на систему, но это было бы настоящей болью.

Есть ли вообще умный способ пойти об этом, кроме замены:

#include <boost/something.hpp> 

в

#include <thirdparty/boost/something.hpp> 

? Если это помогает, я использую gnu make 3.81 и g ++ 4.4.5 на redhat linux.

ответ

0

Посмотрите на параметр командной строки 'include path' (-I). Вы можете указать, где выполняет поиск включенных файлов. Документация here

+0

Спасибо, но я не знаю, если -Я помогу в этом случае. Если более поздняя версия SomeBoost.hpp не найдена в -I/root/thirdparty,/usr/include будет по-прежнему рассматриваться для SomeBoost.hpp. – Bitdiot

0

Вы можете взглянуть на раздел 2.3 НКУ инструкции: http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

Составитель переключения вы ищете, скорее всего, будет

-nostdinc 

Но лучше гляньте сами ,

EDIT: OOP, я просто видел, как вы не хотите, чтобы отключить путь поиска по умолчанию - в этом случае просто используйте -I переключатель:

Вы можете добавить в этот список с помощью опции командной строки -Idir , Все каталоги, названные именем -I, просматриваются в порядке слева направо перед каталогами по умолчанию.

+1

Да, спасибо за своевременный ответ, но добавление -I не решит проблему. (Я не думаю). Проблема заключается в том, что разработчик может иметь более позднюю версию boost, установленную в/usr/include.Итак, я только размещаю каталоги, чтобы смотреть на стандартные каталоги, такие как/usr/include, но он не заменяет/usr/include. Итак, если кто-то добавит в свой код код #include , более поздняя версия все равно может быть поднята, даже если добавлен -I/root/thirdparty, потому что SomeLaterVersion.hpp может скрываться в/usr/включить, после просмотра/root/thirdparty. – Bitdiot

+0

Поиск/usr/local/include ПОСЛЕ того, что каталоги, явно указанные в -I, не должны быть проблемой, поскольку будет использоваться первое совпадение. Возможно, вы захотите проверить порядок с помощью опции -v для cpp. Он должен указать порядок поиска каталогов. – mikyra

+1

Вы в этом уверены? Я не вижу такого поведения на своей машине. Я согласен, что если g ++ найдет заголовок в /root/thirdparty/boost-1.37, он будет использовать это в первую очередь. Но если заголовочный файл не находится в boost-1.37, но в более поздней версии boost он будет смотреть на/usr/include. Так, например, boost/heap/binomial_heap.hpp находится в boost 1.49, поэтому он будет искать файл вне /root/thirdparty/boost-1.37. – Bitdiot