Д. Стефенс - C++. Сборник рецептов
¹ При сборке с помощью указанной командной строки hellobeatles может работать неправильно, так как это приложение будет использовать две копии рабочих библиотек Metrowerks. (См. рецепт 1.23.)
² CodeWarrior 10.0 для Mac OS X будет содержать динамический вариант своих библиотек. При сборке hellobeatles следует использовать именно их. (См. рецепт 1.23.)
Например, при использовании Microsoft Visual Studio .NET 2003 и если она установлена в стандартную директорию на диске С, чтобы собрать hellobeatles.exe из командной строки, перейдите в директорию hellobeatles и введите следующие команды.
> "С:Program FilesMicrosoft Visual Studio .NET 2003VCbinvcvars32.bat"
Setting environment for using Microsoft Visual Studio 2005 tools.
(IF you have another version of Visual Studio or Visual C++ installed
and wish to use its tools from the command line, run vcvars32.bat for
that version.)
> cl -c -nologo -EHsc -GR -Zc:forScope -Zc:wchar_t -MD -I.. -Fohollobeatles hellobeatles.cpp
hellobeatles.cpp
> link -nologo -out:hellobeatles.exe -libpath:../johnpaul -libpath:../georgeringo libjohnpaul.lib libgeorgeringo.lib
> hellobeatles.obj
Обсуждение Поиск включенных заголовочных файловОпция -I используется для указания пути, где находятся заголовочные файлы. Когда компилятор — а на самом деле препроцессор — встречает директиву include в виде:
#include "file"
он обычно пытается вначале найти подключаемый файл, интерпретируя указанный путь относительно директории, в которой находится обрабатываемый исходный файл. Если этот поиск не дает результатов, он пытается найти этот файл в одной из директорий, указанных в опции -I, а затем в директориях, указанных в инструментарии, который часто настраивается с помощью переменных среды.
Эта ситуация аналогична включению заголовочного файла с помощью угловых скобок, как здесь:
#include <file>
за исключением того, что обычно компиляторы не интерпретируют указанный таким образом путь относительно местоположения обрабатываемого исходного файла.
Передача библиотек компоновщикуЕсть несколько интересных аспектов, связанных с командными строками из табл. 1.13.
В Windows вход компоновщика состоит из объектных файлов, статических библиотек и библиотек импорта. В Unix он состоит из объектных файлов, статических и динамических библиотек.
Как в Windows, так и в Unix библиотеки могут передаваться компоновщику двумя способами:
• с помощью указания пути в командной строке;
• с помощью указания только имени библиотеки и места поиска библиотек.
Таблица 1.13 иллюстрирует оба метода.
Места поиска библиотек обычно могут быть указаны в командной строке. Большинство компоновщиков для этой цели используют опцию -L<directory>, но Visual C++ и Intel для Windows используют опцию -lipath: <directory>, a Metrowerks использует опцию -search -L<directory>. Компоновщик Digital Mars позволяет указывать пути поиска библиотек в командной строке вместе с файлами библиотек, при условии, что пути поиска отличаются от файлов библиотек завершающей обратной косой чертой. Также он требует, чтобы эти обратные слеши использовались как разделители в путях.
Comeau в Windows не имеет опции для указания путей поиска библиотек.
Кроме явно указанных директорий компоновщики обычно используют список собственных директорий, который часто может быть настроен с помощью переменных среды. В Windows список директорий обычно включает lib-поддиректорию пути установки инструментария. В результате, если скопировать .lib-файлы в эту директорию, их можно будет указать в командной строке по имени, не указывая их местоположения. Если объединить этот метод с действиями, описанными в рецепте 1.25, то можно вообще избежать передачи компоновщику какой-либо информации о библиотеке.
Способ, которым имя библиотеки передается компоновщику, для Unix и Windows различается. В Windows указывается полный путь библиотеки, включая расширение файла. В Unix — и в Windows при использовании инструментария GCC — библиотеки указываются с помощью опции -l, за которой следует имя библиотеки с удаленными из него расширением файла и префиксом lib. Это означает, что для того, чтобы компоновщик автоматически находил библиотеку, ее имя должно начинаться с префикса lib. Еще интереснее то, что это дает компоновщику возможность выбрать между несколькими версиями библиотек. Если компоновщик находит как статическую, так и динамическую версии библиотеки, выбирается, если не указано другого, динамическая библиотека. На некоторых системах компоновщик может выбрать между несколькими версиями динамической библиотеки, используя часть имени файла, за которой следует .so.
Metrowerks поддерживает как Windows, так и Unix-стили указания имен библиотек.
Наконец, будьте осторожны, так как компоновщики Unix могут быть очень чувствительны к порядку, в котором в командной строке указаны объектные файлы и статические библиотеки: если статическая библиотека или объектный файл ссылаются на символ, определенный во второй статической библиотеке или объектном файле, первый файл должен быть указан в командной строке до второго. Чтобы разрешить круговые зависимости, иногда требуется указать библиотеку или объектный файл несколько раз. Еще одним решением является передача последовательности из объектных файлов и статических библиотек компоновщику обрамленными в -( и -). Это приведет к тому, что поиск в файле будет производиться до тех пор, пока не будут разрешены все зависимости. Этой опции по возможности следует избегать, так как она значительно снижает производительность.
Запуск вашего приложенияЕсли ваше приложение использует динамический вариант библиотеки времени исполнения инструментария, то эта библиотека должна быть доступна приложению при его запуске и должна находиться в таком месте, где динамический загрузчик операционной системы сможет автоматически найти ее. Обычно это означает, что динамическая библиотека времени исполнения должна находиться либо в той же директории, что и ваше приложение, либо в одной из директорий, указанных системе. Это больше относится к разработке для Windows, чем для Unix, так как в Unix соответствующие библиотеки обычно уже установлены по правильным путям. Имена динамических библиотек времени исполнения, поставляемых с различным инструментарием, приведены в рецепте 1.23.
Смотри такжеРецепты 1.10, 1.13, 1.18 и 1.23.
1.6. Установка Boost.Build
Вы хотите получить и установить Boost.Build.
РешениеОбратитесь к документации Boost.Build по адресу www.boost.org/boost-build2 или выполните эти шаги.
1. Перейдите на домашнюю страницу Boost — www.boost.org и проследуйте по ссылке Download (скачать) на страницу SourceForge Boost.
2. Скачайте и распакуйте либо самый последний релиз пакета boost, либо самый последний релиз пакета boost-build. Первый включает полный набор библиотек Boost, а второй — это отдельный релиз Boost.Build. Распакованные файлы поместите в подходящую временную директорию.
3. Скачайте и распакуйте последнюю версию пакета boost-jam для вашей платформы. Этот пакет включает собранный исполняемый файл bjam. Если пакет boost-jam для вашей платформы недоступен, то для сборки исполняемого файла из исходников следуйте инструкциям, прилагаемым к пакету, скачанному вами на шаге 2.
4. Скопируйте bjam в директорию, указанную в переменной среды PATH.
5. Установите переменную среды BOOST_BUILD_PATH в значение корневой директории BoostBuild. Если вы на шаге 1 скачали пакет boost, то корневая директория — это поддиректория tools/build/v2 установки Boost, а в противном случае это директория boost-build.
6. Настройте BoostBuild на ваш инструментарий и библиотеки, отредактировав файл user-config.jam, расположенный в корневой директории Boost.Build. Файл user-config.jam содержит комментарии, поясняющие, как это сделать.
ОбсуждениеНаиболее сложной частью использования Boost.Build является его скачивание и установка. Со временем Boost может предоставить графическую программу установки, но в настоящий момент вы должны следовать приведенным выше шагам.
Целью пятого шага является помощь инструменту сборки — bjam в поиске корневой директории системы сборки. Однако этот шаг необязателен, так как есть другой способ выполнить эту же задачу: просто создайте файл, который называется boost-build.jam, с единственной строкой:
boost-build boost-build-root ;
и поместите его в корневую директорию вашего проекта или любую из его родительских директорий. Если вы хотите распространять BoostBuild вместе с вашим исходным кодом, то второй метод может оказаться предпочтительнее, так как он делает процесс установки более простым для конечных пользователей.