C++. Сборник рецептов
Шрифт:
Инструменты командной строки используют переменные среды как в Unix, так и в Windows, но в Unix обычно есть системный компилятор С++, и переменные среды для его работы обычно по умолчанию устанавливаются в правильные значения. Однако в Windows традиционно имелось несколько конкурирующих компиляторов С++. Например, два различных компилятора будут, скорее всего, искать стандартные заголовочные файлы и библиотеки в различных местах. Следовательно, для Windows инструментарий часто предоставляет сценарии, которые устанавливают несколько переменных среды, в которых записано расположение заголовочных файлов и библиотек, а также другая информация.
Один из способов использовать такой сценарий — запускать его из командной строки перед вызовом
Теперь давайте посмотрим на командные строки в табл. 1.7. Помните, что вам требуется обратить внимание только на ту строку, которая соответствует вашему инструментарию. В общем случае информация, передаваемая компилятору, делится на четыре категории.
• Имя (имена) входного (исходного) файла (файлов).
• Имя (имена) выходного файла (файлов).
• Пути поиска файлов.
• Общая конфигурационная информация.
В табл. 1.6 указан только один входной файл hello.cpp, и он передается компилятору с помощью указания его имени в командной строке. Не имеет значения, в каком месте строки находится имя входного файла, при условии, что оно не находится в середине другой опции командной строки. В табл. 1.7 я поместил hello.cpp в самый конец командной строки.
Также в ней присутствует один выходной файл — hello.exe или hello, в зависимости от операционной системы. Однако в этом случае способ передачи имени файла компилятору зависит от инструментария. Большая часть инструментов для указания выходного файла использует – о <file>, но Visual C++ и Intel для Windows используют – Fe<file>, a Borland использует – e<file>. Заметьте, что указывать расширение исполняемого файла не обязательно.
Единственная информация в табл. 1.7, относящаяся к третьей категории — путям поиска файлов, — имеется в строке для Digital Mars. Так как библиотека STLPort не является встроенной стандартной библиотекой Digital Mars, компилятору с помощью опции – I требуется сообщить, где искать заголовочные файлы STLPort. Заголовочные файлы STLPort расположены в поддиректории /stlport/stlport установки Digital Mars. В табл. 1.7 я указал эту директорию с помощью опции <dmcroot>/stlport/stlport. За дополнительной информацией об опции – I обратитесь к рецепту 1.5.
Большая часть опций командной строки в табл. 1.7 относится к четвертой категории: общей конфигурационной информации. Эти опции не относятся к какому-либо отдельному файлу, а включают или отключают определенные функции компилятора.
• Опции – nologo (Visual C++ и Intel для Windows) и – q (Borland) говорят компилятору не печатать
• Опции – EHsc (Visual C++ и Intel для Windows) и – Ае (Digital Mars) говорят компилятору включить обработку исключений С++.
• Опции – GR (Visual C++ и Intel для Windows) и -Ar (Digital Mars) говорят компилятору включить информацию времени исполнения (RTTI).
• Опции – Zc:wchar_t (Visual C++ и Intel для Windows) и – wchar_t (Metrowerks) говорят компилятору распознавать
• Опция – Zc:forScope (Visual C++ и Intel для Windows) говорит компилятору задействовать современные правила для областей видимости циклов
• Опция -cwd include (Metrowerks) говорит компилятору начинать поиск включенного заголовка с директории исходного файла, содержащего директиву
Далее давайте рассмотрим второе решение нашей проблемы. Вместо того чтобы компилировать и компоновать с помощью одной команды, второй шаг можно разбить на две части.
2a. Введите команду, говорящую компилятору скомпилировать программу в объектный файл без компоновки.
2b. Введите команду, говорящую компоновщику создать исполняемый файл из объектных файлов, созданных на шаге 2a.
В нашем простом случае нет причин для раздельной компиляции и компоновки. Однако раздельная компиляция и компоновка требуются достаточно часто, так что важно, чтобы вы знали, как это делается. Например, при создании статической библиотеки вы должны скомпилировать файлы без компоновки, а затем передать готовые объектные файлы в архиватор.
Команды для компиляции и компоновки в два этапа представлены в табл. 1.8 и 1.9. В некоторых случаях я устанавливаю для объектного файла расширение o[bj], указывающее, что одна и та же командная строка годится и для Windows, и для Unix, за исключением расширения объектного файла.
Табл. 1.8. Команды для компиляции hello.cpp без компоновки
Инструментарий | Командная строка |
---|---|
GCC | g++ --c -o hello.o hello.cpp |
Visual C++ | cl -с -nologo -EHsc -GR -Zc:forScope -Zc:wchar_t -Fohello hello.cpp |
Intel (Windows) | icl -с -nologo -EHsc -GR -Zc:forScope Zc:wchar_t -Fohello hello.cpp |
Intel (Linux) | icpc -с о hello.о hello.cpp |
Metrowerks | mwcc -c -wchar_t on -cwd include -o hello.o[bj] hello.cpp |
Comeau | como -с -o hello.o[bj] hello.cpp |
Borland | bcc32 -c -q -o hello.obj hello.cpp |
Digital Mars | dmc -c -Ae -Ar -l<dmcroot>/stlport/stlport -o hello.obj hello.cpp |