C++. Сборник рецептов
Шрифт:
В некоторых ситуациях компоновка может оказаться более сложным этапом процесса сборки, чем компиляция. Одна из наиболее часто возникающих проблем компоновки создается тогда, когда компоновщик находит неверную версию какой-либо библиотеки. Это в основном проблема Windows, где библиотеки времени выполнения и зависящие ar них библиотеки часто имеют множество вариантов. По этой причине библиотеки для Windows часто поставляются с именами, измененными так, чтобы они отражали различные конфигурации сборки. Хотя это и помогает снизить число конфликтов версий, это также затрудняет процесс компоновки, так как теперь вы должны указывать компоновщику
По этой причине
До сих пор все было хорошо. Но есть одна проблема:
Этот пример уже стал достаточно сложным, и, к сожалению, он все еще не полностью корректен: некоторые компиляторы, не поддерживающие
Здесь строка
определяет имя библиотеки, строка
указывает, что вы не хотите использовать соглашение об именах Boost, а строка
вызывает
Рецепт 1.23.
1.26. Использование экспортируемых шаблонов
Вы хотите собрать программу, использующую экспортируемые шаблоны, что означает, что она объявляет шаблоны в заголовочных файлах с использованием ключевого слова
Во-первых, скомпилируйте в объектные файлы файлы .cpp, содержащие реализации шаблонов, передав компилятору опцию командной строки, необходимую для включения экспортируемых шаблонов. Затем скомпилируйте и скомпонуйте файлы .cpp, использующие экспортируемые шаблоны, передав компилятору и компоновщику опции командной строки, необходимые для включения экспортируемых шаблонов, а также опции, указывающие директории, содержащие реализации шаблонов.
Опции для включения экспортируемых шаблонов приведены в табл 1.39. Опции для указания расположения реализаций шаблонов приведены в табл. 1.40. Если ваш инструментарий в этой таблице не указан, то он, скорее всего, не поддерживает экспортируемых шаблонов.
Табл. 1.39. Опции для включения экспортируемых шаблонов
Инструментарий | Сценарий |
---|---|
Comeau (Unix) | – export, – A или – strict |
Comeau (Windows) | – export или – A |
Intel (Linux) | – export или – strict-ansi¹ |
¹ Версии компилятора Intel для Linux до 9.0 использовали опцию – strict_ansi
Табл. 1.40. Опции, указывающие расположение реализаций шаблонов
Инструментарий | Сценарий |
---|---|
Comeau | – template_directory=<path> |
Intel (Linux) | – export_dir<path> |
Например, предположим, что вы хотите скомпилировать программу, показанную в примере 1.27. Она содержит три файла.
• Файл plus.hpp содержит объявление экспортируемого шаблона функции
• Файл plus.cpp содержит определение
• Файл test.cpp включает объявление — но не определение —
Пример 1.27. Простая программа, использующая экспортируемые шаблоны
plus.hpp: