2012-08-31 3 views
3

Какова наилучшая практика включения библиотек Boost в построенный процесс?Найти библиотеки Boost в Makefile

Для иллюстрации предположим, что наш проект делает использование регулярных выражений BOOST и составлен следующим образом:

g++ -lboost_regex -o main main.cpp 

... а это значит, что я мог бы написать Makefile, который содержит только следующие:

LDFLAGS+=-lboost_regex 

К сожалению, это не работает в моей системе:

$ make main 
ld: library not found for -lboost_regex 
collect2: error: ld returned 1 exit status 

Это понятно, поскольку я не указал путь к библиотеке, и Boost установлен в месте, где компилятор его не находит.

Я не хочу жестко кодировать этот путь в своем Makefile, очевидно. В противном случае проект не может быть построен на других машинах.

Одним из решений было бы установить LD_LIBRARY_PATH, но this is discouraged.

«Реальное» решение для обычных библиотек - использовать pkg-config, например. как это:

LDFLAGS+=$(shell pkg-config --libs sqlite3) 

... который разрешен к чему-то вдоль линий -L/path/to/sqlite/lib -lsqlite3.

К сожалению, Boost still doesn’t support pkg-config.

Это оставляет мне дилемму. Кажется, что нет универсального способа определения пути установки библиотеки Boost. Как другие проекты справляются с этим?

(Кто-то предложил переменную окружения BOOST_ROOT, но это не кажется, повсеместно присутствует либо, вам нужно вручную установить его в на одном из файлов Bashrc/профиля.)

+0

Вы можете указать несколько опций '-L' и' -Wl, -rpath, ', и компоновщики будут искать их по порядку. –

+0

@Maxim True, но вам нужно жестко закодировать пути и просто угадать, какие из них могут быть. В некоторых случаях это просто не работает. Например, у меня установлен Boost в пути '/ nfs/company_name/research/groupname/subfolder/lib' - как вы должны догадываться об этом пути? –

+0

@Konrad: сделайте это glob-поиск папки 'boost'! : D – Xeo

ответ

2

Поскольку я m, кто предложил использовать BOOST_ROOT, я могу ответить как ответ.

Background: Boost's bjam Для сборки программы требуется переменная окружения BOOST_ROOT, если она не выполнена внутри корня установки boosts.
С этой мыслью можно было бы «положиться» на нее, т. Е. Требовать, чтобы она присутствовала, когда make вызывается либо постоянно, либо постоянно, либо просто устанавливал его во время сеанса/команды, как BOOST_ROOT=/foo/bar/boost make.

+0

Считается, что неправильная практика для скриптов сборки зависит от переменных среды. –

+1

@Maxim Конечно, * если * имеется лучшее решение. Пока что это не так. –

+0

Это необязательная переменная окружения. Например, GNU Make может принимать значения переопределения переменных в качестве аргументов командной строки. – Tanz87

 Смежные вопросы

  • Нет связанных вопросов^_^