1.25. Указание определенной библиотеки для автоматической компоновки с исходным файлом
1.25. Указание определенной библиотеки для автоматической компоновки с исходным файлом
Проблема
Вы написали библиотеку, которую хотите распространять в виде набора заголовочных файлов и готовых статических или динамических библиотек, но не хотите, чтобы пользователи вашей библиотеки должны были сами указывать имена библиотек при компоновке приложений.
Решение
При программировании для Windows с использованием инструментария Visual C++, Intel, Metrowerks, Borland или Digital Mars для указания имен и (при необходимости) путей готовых библиотек, с которыми должен компоноваться код, включающий заголовочные файлы вашей библиотеки, используйте в этих заголовочных файлах pragma comment.
Например, предположим, что вы хотите распространить библиотеку из примера 1.1, состоящую из статической библиотеки libjohnpaul.lib и заголовочного файла johnpaul.hpp. Измените этот заголовочный файл так, как показано в примере 1.26.
Пример 1.26. Использование pragma comment
#ifndef JОНNPAUL_HPP_INCLUDED
#define JOHNPAUL_HPP_INCLUDED
#pragma comment(lib, "libjohnpaul")
void johnpaul();
#endif // JOHNPAUL_HPP_INCLUDED
После этого изменения компоновщики Visual С++, Intel, Metrowerks, Borland и Digital Mars при компоновке кода, включающего заголовочный файл johnpaul.hpp, будут автоматически находить библиотеку libjohnpaul.lib.
Обсуждение
В некоторых ситуациях компоновка может оказаться более сложным этапом процесса сборки, чем компиляция. Одна из наиболее часто возникающих проблем компоновки создается тогда, когда компоновщик находит неверную версию какой-либо библиотеки. Это в основном проблема Windows, где библиотеки времени выполнения и зависящие ar них библиотеки часто имеют множество вариантов. По этой причине библиотеки для Windows часто поставляются с именами, измененными так, чтобы они отражали различные конфигурации сборки. Хотя это и помогает снизить число конфликтов версий, это также затрудняет процесс компоновки, так как теперь вы должны указывать компоновщику правильное измененное имя.
По этой причине pragma comment очень полезна. Среди прочего она позволяет указать правильное имя библиотеки в заголовочном файле и избавить пользователя от необходимости разбираться в ваших соглашениях об изменении имен файлов. Если в дополнение к этому вы разработаете процесс установки, копирующий двоичные файлы в папку, автоматически используемую компоновщиком, — такую как поддиректория lib корневых директорий Visual С++, CodeWarrior или C++Builder, — то программисты смогут использовать вашу библиотеку, просто включив ее заголовочные файлы.
До сих пор все было хорошо. Но есть одна проблема: pragma comment распознается не всеми компиляторами. Если вы хотите писать портируемый код, вы должны вызывать pragma только после того, как проверите, что она поддерживается используемым инструментарием. Например, вы можете изменить johnpaul.cpp вот так.
#ifndef JOHNPAUL_HPP_INCLUDED
#define JOHNPAUL_HPP_INCLUDED
#if defined(_MSC_VER) ||
defined(__ICL) ||
defined(__MWERKS__) && defined(_WIN32) ||
defined(__BORLANDC__)
defined(__DMC__)
/**/
#pragma comment (lib, "libjohnpaul")
#endif
void johnpaul();
#endif // JOHNPAUL_HPP_INCLUDED
Этот пример уже стал достаточно сложным, и, к сожалению, он все еще не полностью корректен: некоторые компиляторы, не поддерживающие pragma comment, для совместимости в Visual C++ определяют макрос _MSC_VER. К счастью, Boost предоставляет простое решение.
#ifndef johnpaul_hpp_included
#define JOHNPAUL_HPP_INCLUDED
#define BOOST_LIB_NAME libjohnpaul
#define BOOSTAUTO_LINK_NOMANGLE
#include <boost/config/auto_link.hpp>
void johnpaul();
#endif // JOHNPAUL_HPP_INCLUDED
Здесь строка
#define BOOST_LIB_NAME libjohnpaul
определяет имя библиотеки, строка
#define BOOST_AUTO_LINK_NOMANGLE
указывает, что вы не хотите использовать соглашение об именах Boost, а строка
#include <boost/config/auto_link.hpp>
вызывает pragma comment для поддерживающих ее компиляторов.
Смотри также
Рецепт 1.23.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Запрещение определенной линии прерывания
Запрещение определенной линии прерывания В предыдущем разделе были рассмотрены функции, которые позволяют запретить доставку всех прерываний на определенном процессоре. В некоторых случаях полезным может оказаться запрещение определенной линии прерывания во всей
25.3.1. Чтение определенной записи
25.3.1. Чтение определенной записи Функции dpget() и dpgetwb() производят поиск записей в базе данных по ключу.int dpget(DEPOT * depot, const char * key, int keySize, int start, int max, int * dataSize);key является элементом (ключом), с помощью которого производится поиск по базе данных, a keySize определяет длину ключа (или
Создание объекта для обмена данными между XML-файлом и формой
Создание объекта для обмена данными между XML-файлом и формой В отличие от рассмотренного выше сценария PhoneBook.wsf, в сценарии IEPhoneBook.js функции для работы с записной книжкой не будут разделены по разным заданиям, поэтому для более четкой организации сценария мы воспользуемся
1. Сферы применения систем автоматической обработки текстов
1. Сферы применения систем автоматической обработки текстов Системы автоматической обработки текста (т.е. переработки одного вида текста в памяти ЭВМ в другой) по выполняемым функциям (входной и выходной информации) можно классифицировать следующим образом:Язык
2. Лингвистическое обеспечение систем автоматической обработки текстов
2. Лингвистическое обеспечение систем автоматической обработки текстов Один из главных путей развития функциональных возможностей прикладных АОТ-систем и повышения качества их работы - создание и внедрение более полных и точных моделей естественных языков, более
Увеличение определенной области фотографии
Увеличение определенной области фотографии На рис. 33 вы видите пример работы с очень удобным инструментом для пользователей, который позволяет увеличивать определенную область фотографии. В окошке слева клиент с помощью мыши выбирает прямоугольную область для
2.12. Завершение работы с файлом
2.12. Завершение работы с файлом В версии текстового редактора Word 2007 появилась новая функция – завершение работы с файлом. Выбрав в меню кнопки Office пункт Подготовить, вы получите доступ к операциям, которые разработчики предлагают выполнить перед тем как документ станет
14. Предпочитайте ошибки компиляции и компоновки ошибкам времени выполнения
14. Предпочитайте ошибки компиляции и компоновки ошибкам времени выполнения РезюмеНе стоит откладывать до выполнения программы выявление ошибок, которые можно обнаружить при ее сборке. Предпочтительно писать код, который использует компилятор для проверки инвариантов
1.23. Указание варианта библиотеки времени выполнения
1.23. Указание варианта библиотеки времени выполнения ПроблемаВаш инструментарий поставляется с несколькими вариантами базовых библиотек времени выполнения, и вы хотите указать компилятору и компоновщику тот вариант, который должен использоваться.РешениеБиблиотеки
3.4. Конфигурирование ограничений автоматической компоновки в конструкторе интерфейсов
3.4. Конфигурирование ограничений автоматической компоновки в конструкторе интерфейсов Постановка задачи Требуется задействовать весь потенциал конструктора интерфейсов для создания ограничений при работе с пользовательским
5.3. Обеспечение последовательной компоновки в сборном виде
5.3. Обеспечение последовательной компоновки в сборном виде Постановка задачи Требуется, чтобы ваш сборный вид был скомпонован как таблица (сетка), чтобы его содержимое отображалось примерно так же, как на
Мастер компоновки листа
Мастер компоновки листа Настройка параметров листа может производиться с помощью Мастера компоновки листа. Для этого необходимо загрузить диалоговое окно Create Layout, показанное на рис. 15.3, из падающего меню Tools ? Wizards ? Create Layout.. . или ввести LAYOUTWIZARD в командной строке. Рис. 15.3.
Зависание после запуска определенной программы
Зависание после запуска определенной программы Вы запускаете какую-нибудь программу, например игру, и компьютер зависает. Важно определить, зависает ли компьютер только при запуске этой программы или при запуске этого типа программ. Понимаете разницу? Может быть ошибка