Чтобы скомпилировать каждый из трех исходных файлов из примера 1.1, используйте командные строки из табл. 1.8, изменив соответственно имена входного и выходного файлов. Чтобы объединить результирующие объектные файлы в статическую библиотеку, используйте команды, приведенные в табл. 1.10.
Табл. 1.10. Команды для создания архива libjohnpaul.lib или libjohnpaul.а
Инструментарий | Командная строка |
---|
GCC (Unix) Intel (Linux) Comeau (Unix) | ar ru libjohnpaul.a john.c paul.о johnpaul.o ranlib libjohnpaul.a |
GCC (Windows) | ar ru libjohnpaul.a john.o paul.o johnpaul.о |
Visual C++ | lib -nologo -out:libjohnpaul.lib john.obj paul.obj johnpaul.obj |
Comeau (with Visual С++) | |
Intel (Windows) | xilib -nologo/out:libjohnpaul.lib john.obj paul.obj johnpaul.obj |
Metrowerks (Windows) | mwld -library -o libjohnpaul.lib john.obj paul.obj johnpaul.obj |
Metrowerks (Mac OS X) | mwld -library -o libjohnpaul.a john.о paul.o johnpaul.о |
Borland | tlib libjohnpaul lib /u /a /C +john +paul +johnpaul |
Digital Mars | lib -c -n libjohnpaul.lib john.obj paul.obj johnpaul.obj |
Например, чтобы скомпилировать john.cpp, paul.cpp и johnpaul.cpp в объектные файлы с помощью GCC, перейдите в директорию johnpaul и введите следующие команды, создающие объектные файлы john.о, paul.о и johnpaul.о:
$ g++ -с -о john.o john.cpp
$ g++ -с -о paul.o paul.cpp
$ g++ -с -о johnpaul.о johnpaul.cp
p
Теперь скомпонуйте эти объектные файлы в статическую библиотеку следующим образом.
$ ar ru libjohnpaul.a john.o paul.o johnpaul.о
$ ranlib libjohnpaul.а
ОбсуждениеПри использовании GCC в Unix для создания статической библиотеки вы используете две отдельные команды: во-первых, вы вызываете архиватор ar, а затем вызываете инструмент с именем ranlib. Опция ru говорит ar добавить указанные объектные файлы в указанный архив, если в нем отсутствуют члены с такими же именами, а обновить существующий член архива только в том случае, если указанный объектный файл новее, чем существующий член архива. Традиционно после создания или обновления архива использовался инструмент ranlib, который создает или обновляет таблицу символов архива, т.е. указатель символов, которые присутствуют в содержащихся в архиве объектных файлах. Сегодня на многих системах архиватор ar самостоятельно заботится об обновлении таблицы символов, так что запуск ranlib необязателен. В частности, это верно для версии GNU ar. Однако на некоторых системах компилятор GCC может использоваться в сочетании с не-GNU-версией ar, и по этой причине для безопасности лучше запустить ranlib.
Как вы можете видеть в табл. 1.10, архиватор Borland tlib использует несколько необычный синтаксис: знак «плюс» перед объектными файлами говорит tlib добавить объектные файлы в библиотеку. Остальные командные строки должны быть вам понятны без пояснений.
В некоторых наборах инструментов в качестве архиватора может использоваться компоновщик, если ему передать соответствующую опцию командной строки. В других наборах должен использоваться отдельный архиватор.
Смотри такжеРецепты 1.8, 1.11 и 1.16.
1.4. Сборка динамической библиотеки из командной строки
ПроблемаВы хотите использовать свои инструменты командной строки для сборки динамической библиотеки из набора исходных файлов С++, таких как перечисленные в примере 1.2.
РешениеВыполните следующие шаги.
1. Используйте компилятор для компиляции исходных файлов в объектные файлы. Если вы используете Windows, то для определения макросов, необходимых для организации экспорта символов динамической библиотеки, используйте опцию -D. Например, чтобы собрать динамическую библиотеку из примера 1.2, вы должны определить макрос GEORGERINGO_DLL
. Если вы собираете библиотеку, написанную кем-то другим, то макросы, которые требуется определить, должны быть описаны в инструкции по установке.