Использование компилятора GNU C/C++ при работе с AIX

Эксперты IBM описывают, как можно использовать компилятор GCC при работе с AIX®. Авторы объясняют, почему следует использовать компилятор GCC, какие опции компилятора специфичны для pSeries, что следует знать о библиотеках коллективного доступа, а также рассказывают о типичных проблемах и способах их решения.

Анита Говинджи, IBM Systems and Technology Group, IBM

Анита Говинджи (Anita Govindjee) занимает должность менеджера управления решениями в IBM ISV Solutions Enablement group. Анита обладает более чем 10-ти летним опытом работы с UNIX-платформами, включая AIX, Linux, Solaris, и HPUX, и разработки ПО C, C++ и Java. Она обладает дипломом бакалавра компьютерных наук университета University of Illinois, Urbana-Champaign, и дипломом магистра в области компьютерных наук Стенфордского Университета (Stanford University). Связаться с Анитой можно по адресу agovindj@us.ibm.com.



Дэвид Эдельсон, IBM Research Group, IBM

Дэвид Эдельсон (David Edelsohn) работает в IBM Research Division над операционными системами и компиляторами, включая поддержку PowerPC для GCC. Дэвид работает с Unix-платформами более 15-ти лет, разрабатывая программное обеспечение с открытым исходным кодом для AIX, Linux, BSD, Solaris, и Ultrix. Дэвид обладает дипломом бакалавра калифорнийского Университетом в Беркли (University of California, Berkeley) и дипломом магистра Калифорнийского Института Технологий (California Institute of Technology), и дипломом доктора Университета Сиракуз (Syracuse University). Связаться с Дэвидом можно по адресу edelsohn@us.ibm.com.



Рамеш Читор, IBM Systems and Technology Group, IBM

Рамеш Читор (Ramesh Chitor) работает специалистом-консультантом по разработке программного обеспечения в Solutions Enablement; в область его ответственности входят проекты из Tools Group и Software Group, базы данных и поддержка партнеров ISV (независимые поставщики ПО). Связаться с Рамешом можно по адресу rchitor@us.ibm.com.



30.06.2008

Основы GCC

Компилятор GCC является частью проекта Free Software Foundation's GNU. GCC разработан с помощью среды разработки Open Source одом, как и все инструменты GNU, и поддерживает различные платформы, включая AIX. GCC расшифровывается как GNU Compiler Collection (набор компиляторов GNU) и поддерживает многие языки программирования, таких как C, C++, Objective C, Fortran, и Java. В этой статье мы будем рассматривать GCC версий 3.3.4 и все версии 3.4 для AIX версий 5.1, 5.2 и 5.3.

Сравнение компилятора GCC с компилятором XL C/C++

XL C/C++ Enterprise Edition V7.0 для AIX является последующим релизом среды VisualAge® C++ Professional V6.0 для AIX. В этом разделе мы расскажем о преимуществах использования компилятора GCC в AIX по сравнению с компилятором XL C/C++. Компилятор XL обладает значительной поддержкой новейших стандартов языков программирования. Компилятор XL C/C++ поставляется с новыми встроенными функциями для деления чисел с плавающей точкой, новыми псевдокомментариями и дополнительным новыми опциями. Ключевой особенностью IBM XL C/C++ Advanced Edition V7.0 для AIX является расширенная совместимость с GCC. Для помощи в миграции кода, изначально написанного для GCC, некоторые специфические возможности GNU C/C++ поддерживаются компилятором XL C/C++. Особенно важно что, компилятор XL C/C++ оптимизирован для систем PowerPC, включая POWER5.

Но есть несколько ситуаций, когда использование компилятора GCC может оказаться более предпочтительным. Когда приложения написаны с использованием стандартных API и скомпилированы при помощи компиляторов GNU gcc или g++ , портировать их на различные платформы гораздо проще. GCC имеет внешние интерфейсы для разнообразных языков программирования, которые облегчают синтаксический разбор кода на этих языках. GCC является переносимым компилятором и работает на большинстве платформ, доступных сегодня, и при этом поддерживает большинство 64-битных процессоров. GCC является платформенно-зависимым кросс-компилятором, который может скомпилировать любую программу, создав при этом исполняемый файл для любой платформы, даже отличной от той, на которой работает сам компилятор GCC. Это позволяет скомпилировать программное обеспечение для встроенных систем, у которых нет возможности работать с компилятором. GCC написан на языке C с сильным уклоном на переносимость, и может откомпилировать сам себя; этот компилятор может быть легко адаптирован к новым системам. Наконец, GCC предоставляет свободу в улучшении GCC и другого программного обеспечения GNU, созданного сторонними разработчиками.

Попытки разработчиков реализовать поддержку своих приложений на различных платформах, используя различные компиляторы на этих платформах, редко заканчиваются успехом. Если вместо этого использовать компилятор GCC, поддерживаемый многими платформами, то это уменьшит проблемы, возникающие при портировании приложения с одной платформы на другую. GCC может облегчить работу программиста, предоставив общую среду компилирования для различных платформ. Также g++ теперь ближе к полному соответствию со стандартами ISO/ANSI C++.

Заметим, что обычная операционная система AIX не понимает make-файлы GCC. Для того, чтобы можно было загрузить компилятор GCC на AIX, необходимо чтобы на этой ОС были make-файлы GNU. Нужно выполнить команду make -v для того, чтобы узнать, что необходимо для компилирования с использованием GCC.

Совместимость на уровне двоичных кодов в AIX 5L

IBM обеспечивает совместимость на уровне двоичных кодов между версиями ОС AIX 5.1, AIX 5.2 и AIX 5.3 . Следовательно, приложения, работающие на AIX 5.1 или на AIX 5.2, будут работать таким же образом и на версии 5.3, в случае если при их разработке были соблюдены критерии, изложенные в документе IBM’s AIX 5L binary compatibility. К этому можно добавить, что независимые поставщики программного обеспечения (ISV в дальнейшем) используют разные способы поддержки новой версии ОС. Большинство из ведущих ISV проводят тестирование своих приложений на совместимость с новой ОС, обычно это некоторый набор тестов, по завершению которого ISV заявляет о поддержке новой ОС. Однако другие ISV изучают разработанные IBM подробные критерии совместимости на уровне двоичных кодов и если их приложение соответствует этим критериям, то оно считается совместимым с новой ОС. В обоих случаях нет необходимости в перекомпилировании приложений для использования их под ОС AIX 5.3.

Инсталляция GCC на AIX

Инсталлировать GCC на AIX легко - для этого нужен только двоичный код соответствующей версии GCC. Двоичные файлы можно скачать с сайта Bull AIX Freeware, с сайта IBM AIX Toolbox for Linux applications, или с cайта Интернет-библиотеки UCLA AIX Software. После загрузки подходящего двоичного файла необходимо изменить режим доступа к загруженному файлу при помощи команды chmod, чтобы он стал исполняемым, а затем запустить SMIT для установки. На Web-сайте UCLA имеется двоичный код GCC version 3.3.4 для AIX 5.1. Версия GCC 3.3.4 совместима на уровне двоичных кодов с AIX 5.2. В GCC version 3.3 была добавлена поддержка для AIX 5.2.

На данный момент на сайте с IBM AIX Toolbox for Linux applications доступны двоичные файлы GCC 3.3.2 для ОС AIX 5.1 и 5.2. Также на сайте BULL Freeware имеется GCC версии 3.3.2 для ОС AIX 5.2.

Если требуется GCC версии 3.4.x, сначала понадобится инсталлировать на систему двоичные коды GCC версии 3.3.4 (или 3.3.2). Как только будет установлена GCC версии 3.3.x, можно будет использовать GCC для компиляции новой версии GCC 3.4.x на используемой системе AIX. Перед выполнением инсталляции следует внимательно прочитать Инструкции по инсталляции GCC, а также просмотреть Web-страницу, где размещены инструкции по платформенно-зависимой установке GCC. Очень важно следовать платформенно-зависимым инструкциям - прежде чем начать процесс сборки и установки GCC, нужно внимательно прочесть эти инструкции. Следующие отчеты о сборке GCC могут оказаться полезными при проверке правильности установки GCC 3.4.x. В тоже время существуют отчеты о сборке для AIX 5.1 и AIX 5.2. Например, отчет по сборке GCC 3.4.2 для AIX 5.2 доступен по этой ссылке.

Необходимо убедится, что была установлена версия GCC, соответствующая установленной версии AIX. GCC устанавливает собственные копии некоторых заголовочных файлов, которые должны корректно интегрироваться с заголовочными файлами системы AIX для нормального функционирования GCC, иначе при работе компилятора могут возникнуть сообщения об ошибках, связанных с заголовочными файлами. Заголовочные файлы, если они не согласованы, должны быть заново скомпонованы. Можно удалить кэш заголовочного файла, чтобы скомпоновать новый релиз GCC из старых исходных кодов, но GCC не будет работать без кэша заголовочных файлов.

Ссылки на Web-сайты

Для более исчерпывающей информации о проекте GNU и компилятору GCC следует посетить официальный Web-сайт. Список новых возможностей в GCC версии 3.3 доступен по этой ссылке. Также, список новых возможностей в GCC версии 3.4.3 доступен по ссылке.


Опции компилятора GCC

Для GCC доступно большое количество опций компилирования, начиная от оптимизации кода, компилирование с учетом стандарта ISO/ANSI или без учета оного, до опций отладки, опций компилирования кода-шаблона. GCC также предоставляет некоторые опции, характерные только для pSeries (бывших RS/6000) и платформ PowerPC.

Полное описание опций, доступных для платформ POWER и PowerPC, размещено на Web-странице. Ниже мы рассмотрим несколько опций, которые мы сочли особо важными.

Из опций, которые используются для настройки типа процессора, например, -mcpu и -mtune, лучше использовать стандартные опции, предоставляемые GCC. На AIX 4.3 и AIX 5.1, стандартными опциями являются -mcpu=common - этот код будет работать на всех компьютерах с процессором семейства pSeries (RS/6000). На AIX 5.2 и следующих версиях, стандартной опцией является -mcpu=powerpc - этот код будет работать на процессорах pSeries PowerPC. GCC принимает тип современного процессора, ассоциированного с текущим релизом AIX, в качестве модели процессора для задач планирования.

Для оптимизации под определенный процессор или класс процессора следует использовать опции -mcpu=power, -mcpu=power2, -mcpu=powerpc, -mcpu=power4 и другие. Не стоит использовать опции -mpower, -mpowerpc, -mpower2 или -mpowerpc64. Хотя они и доступны, они не предназначены для использования конечным пользователем. Применение по отдельности опции -mpower2 или других опций может повлечь непредсказуемые результаты, потому что компилятор может находиться в несовместимом режиме с целевым процессором.

Чтобы скомпилировать приложение в 64-х битном режиме, следует использовать опцию -maix64, которая активирует 64-х битный машинный интерфейс (ABI в дальнейшем) AIX, например, 64-битные указатели, 64-битные длинные типы, и инфраструктуру, которая необходима для их поддержки. Установка -maix64 влечет за собой установку -mpowerpc64 и -mpowerpc, тогда как -maix32 отключает 64-битный ABI и опцию -mno-powerpc64. GCC по умолчанию использует -maix32.

При получении сообщения об ошибке от компоновщика, в котором говорится что переполнено доступное пространство TOC (Table of Contents - области оглавления), можно уменьшить пространство TOC при помощи команды -mminimal-toc. По умолчанию GCC использует -mfull-toc . который распределяет по крайней мере одну TOC-запись для каждой уникальной неавтоматической ссылочной переменной. Также GCC помещает в TOC константы с плавающей точкой. Однако, в TOC доступно только 16 384 элементов, и поэтому вполне можно его переполнить. Опция -mminimal-toc GCC позволяет ставить в соответствие с одним элементом TOC только одну функцию.

-pthread компилирует и компонует приложение с библиотекой POSIX threads таким же образом, как это было бы сделанно в среде VisualAge (или XL) C/C++. В VisualAge (или XL) C/C++ для обеспечения поддержкт потоков можно выполнить компиляцию и компоновку при помощи опций xlc_r или xlC_r, но эти опции не будут работать с GCC. Поэтому для GCC код с поддержкой потоков должен быть скомпонован с использованием -pthread. Опция -pthread установит соответствующие флаги как для препроцессора, так и для компоновщика.

Опция -g создает информацию об отладке, характерную для -gxcoff+ на уровне 2. Отладочная информация может содержать некоторые дополнительные сведения, предназначенные для GNU Debugger (GDB). Чтобы создать отладочную информацию более совместимую с AIX dbx, следует использовать опцию -gxcoff.

GCC для AIX не поддерживает полностью опцию -msoft-float. Применение этой опции прекратит использование регистров с плавающей точкой в GCC, но, однако, вспомогательные библиотеки GCC и библиотеки AIX будут продолжать использовать регистры с плавающей точкой.

Использование опций -mlittle-endian и -mcall-linux в конфигурации AIX не корректно. В документации указаны все опции для целевых платформ "rs6000" GCC. Но не все опции доступны для использования с какой-либо определенной конфигурацией.

Для передачи опций напрямую платформенно-зависимому компоновщику AIX, используйте -Wl, <linker option>.

Опции компиляторов G++ и GCC

Описание опций, характерных для компилятора g++, размещено по этой ссылке. Эти опции действительны и для AIX.

Также полное описание опций, характерных для компилятора gcc, размещено на Web-странице. Эти опции действительны также для AIX и других UNIX-систем.

Список опций для оптимизации размещен на странице .

Наиболее распространенной опцией оптимизации является -O2, которая позволяет, увеличить производительность исполняемого файла или библиотеки. -O3 предоставляет больше возможностей оптимизации, которые могут увеличить производительность за счет более длительного процесса компиляции. -Os увеличивает производительность и при этом пытается уменьшить размеры программного кода.

Дополнительные опции оптимизации, которые полезны для сложных научных расчетов, включают в себя -funroll-loops и -ffast-math. -ffast-math, и позволяют компилятору увеличить производительность за счет точного соответствия стандартам IEEE и ISO для математических функций.


Библиотеки коллективного доступа в AIX и в Unix System V

Давайте сначала рассмотрим различия между AIX и Unix System V, которые относятся к библиотекам коллективного доступа, а затем объясним как при помощи GCC можно создавать библиотеки коллективного доступа для AIX.

AIX и Unix System V по разному рассматривают библиотеки коллективного доступа. AIX в основном рассматривает объекты коллективного доступа как полностью скомпонованные и законченные сущности, в которых ссылки на имена утверждаются во время компоновки, и не могут быть изменены во время загрузки. Unix System V видит объекты коллективного доступа как обычные объектные файлы, в которых все глобальные названия переменных утверждаются компоновщиком во время выполнения. Однако, AIX имеет возможность делать компоновку на этапе выполнения (run-time linking (RTL)), так что имена переменных могут оставаться неопределенными до этапа загрузки, на котором будет выполнен поиск необходимых определений во всех загруженных модулях.

Совместно используемый модуль в AIX может являться объектным файлом или архивным файлом, который может содержать в себе модули для совместного использования и/или обычные объектные файлы. В Unix System V библиотеки коллективного доступа всегда являются обычными файлами, которые были созданы при помощи специальных опций.

В AIX, как правило, все объекты для коллективного использования, с которыми будет работать компоновщик, в выходном файле перечисляются как зависимые объекты только в случае, если существует ссылка на их имена. Чтобы явно экспортировать имена, AIX использует экспортные файлы. В Unix System V название всех библиотек коллективного доступа, перечисленных в строке команды, сохраняется в выходном файле для возможного использования на этапе загрузки. Однако, начиная с AIX 4.2 и во всех доступных сейчас релизах AIX (4.3, 5.1, и 5.2), опция -brtl принуждает все совместно используемые объекты (исключая архивированные объекты), содержащиеся в строке команды, отображаться в выходном файле зависимыми объектами. Для большей информации ознакомьтесь с AIX Linking and Loading Mechanisms (Механизмы компоновки и загрузки AIX)(PDF 184KB).

Для компилятора GCC библиотека коллективного доступа создается командой gcc -share. Компоновщик автоматически экспортирует имена некоторых элементов, однако, если надо экспортировать больше элементов, следует использовать команду AIX ld -bexpall. Имена с символом подчеркивания не экспортируются автоматически. В AIX 5.2 или AIX 5.1 на втором уровне обслуживания (maintenance level 2) можно использовать новую опцию компоновки -bexpfull, которая будет экспортировать все имена, и не пропустит имена, которые начинаются с символа подчеркивания (как измененные имена в C++). Для полного контроля лучше всего будет создать экспортный файл. Если программист не знаком с экспортными файлам AIX, то ему следует прочесть документ AIX Linking and Loading Mechanisms (Механизмы компоновки и загрузки AIX)(PDF 184KB).

Как уже говорилось выше, команда gcc -shared создает жестко-привязанный объект в стиле AIX для совместного использования. gcc -shared вызывает компоновщик AIX с опцией -bM:SRE -bnoentry. Следовательно, нет нужды комбинировать эти две опции AIX.

При использовании -brtl компоновщик AIX будет искать библиотеки с расширениями .a и .so, например, libfoo.a и libfoo.so. Без опции -brtl компоновщик AIX будет искать только libfoo.a. Создать libfoo.a простым архивированием объекта коллективного доступа или переименованием объекта коллективного доступа в libfoo.a - для AIX важно, чтобы был суффикс .a. Чтобы использовать в AIX компоновку на этапе выполнения, следует при помощи команды gcc -shared -Wl,-G создать объект коллективного доступа и, затем, используя библиотеку, то есть добавив опцию -Wl,-brtl в команду компоновки, создать исполняемый файл. Технически можно не использовать опцию -shared, однако эта опция безвредна и уменьшает путаницу.

Если необходимо создать объект для коллективного использования с помощью GCC, понадобится только gcc -shared и, возможно, опция -bexpfull или экспортный файл со ссылкой на себя -Wl,-bE:<export filename>.exp Это просто.

Возможные проблемы при использовании GCC/G++ на AIX

Ниже перечислены несколько возможных проблем, с которыми можно столкнуться при использовании GCC или G++ на AIX. Для каждой проблемы мы приведем описание, а затем покажем способ ее решения.

  • Нельзя использовать GNU-компоновщик на AIX, поскольку это приведет к некорректно скомпонованному двоичному коду. По умолчанию AIX-компоновщик применяется при использовании GCC на AIX. Следует использовать только стандартный компоновщик AIX.
  • При компилировании и компоновке с использованием -pthread, путь поиска библиотеки должен начинаться с -L/usr/lib/threads. Нужно провевить выходные данные дампа -Hv, строки файла импорта, entry 0, чтобы узнать, какими могут быть пути к этой библиотеке. Подкаталог threads всегда должен указываться перед каталогами /usr/lib и /lib.
  • Команда gcc -o foo ... -L/path -lmylib не выполнится. GCC не может открыть библиотеку потому, что он ищет статическую библиотеку libmylib.a, а не libmylib.so. Если сменить расширение .so на .a, команда скомпилируется и выполнятся. Архивные библиотеки и библиотеки коллективного доступа на AIX могут иметь расширение .a. Этот факт объясняет то, почему нельзя скомпоновать .so и почему можно выполнить это действие с расширением .a.
  • При выполнении 64-битного приложения на C++, использующего библиотеки коллективного доступа C++ и обработку исключений, это приложение аварийно завершает свое выполнение. GCC 3.4.3 исправляет ошибку, которая мешала проводить корректную обработку исключений на C++ в 64-битном режиме, возникающих в библиотеках коллективного доступа.
  • При компоновке приложения с архивным или объектным файлом (обычной, а не для коллективного использования, библиотекой) выводилось сообщение об ошибке, связанной с не разрешенными именами. Такое может случиться, если библиотека содержит объектные файлы со ссылками на названия элементов вне библиотеки, которые, как программист думал, компоновщик проигнорирует.

    GCC предоставляет оболочку для системного компоновщика, которая сканирует все объектные файлы и неиспользуемые совместно библиотеки на предмет конструкторов и деструкторов. Это делается до того, как компоновщик получит возможность пропустить ненужные объектные файлы в библиотеке, поскольку только в конструкторе или деструкторе может присутствовать ссылка на какие-либо функции или данные. Просмотр может выявить конструкторы и деструкторы, на которые приложение обычно не ссылается, поскольку для того, чтобы на них можно было сослаться, нужны дополнительные определения имен. В качестве альтернативного решения можно опустить конструкторы и деструкторы, которые требуются для приложения потому, что некоторые объектные файлы в библиотеке, которые кажутся ненужными и поэтому ими пренебрегают, могут предоставлять требуемые конструкторы и деструкторы. Игнорирование этих файлов приведет к аварийному завершению работы приложения.

  • Попытки скомпилировать GCC на AIX заканчиваются сообщением об ошибке ассемблера. Чтобы исправить это, нужно проверить, что не используется устаревшая версия GNU ассемблера, который не понимает некоторые особенности PowerPC. Как говорится в инструкциях по установке AIX на интернет-сайте GNU GCC, предпочтительным является использование ассемблера AIX.
  • Иногда, по ходу процесса компоновки может возникнуть сообщение об ошибке:
    ld fatal: failed to write symbol name symbol_name in strings table for file filename

    Эта ошибка может указывать на то, что диск заполнен или на то, что переменная среды ULIMIT не позволяет файлу достичь необходимых размеров.

  • G++ выполняет изменение имен не таким способом, как VisualAge (или XL) C++. Это означает что объектные файлы, скомпилированные одним компилятором, не смогут использоваться другим компилятором.
  • GNU-ассемблер (GAS) не поддерживает PIC. Для создания PIC-кода следует использовать какие-либо другие ассемблеры, например, платформенно-зависимый компилятор AIX `/bin/as'.
  • В AIX, компилирование кода типа:
    extern int foo;
     ... foo ...
     static int foo;

    приведет к тому, что компоновщик сообщит о неопределенном имени foo. Хотя это поведение и отличается от большинства других систем, оно не является ошибочным, поскольку переопределение внешней переменной в статическую не определено в ANSI C.

  • " В версиях GCC, предшествующих GCC 3.4, не все структуры данных передаются по значению. GCC 3.4 сейчас обладает более лучшей поддержкой ABI для передачи параметров структуры. Хотя эти изменения увеличивают соответствие между GCC и AIX ABI, они могут стать причиной несовместимостей с кодом, скомпилированным при помощи ранних версий GCC. Для получения дополнительной информации нужно изучить предлагаемый документ.
  • Когда GCC собирается для определенной версии AIX, он создает некоторые файлы, характерные только для этой версии ОС и ее заголовочных файлов. Это может стать проблемой при использовании данной сборки GCC на более новых версиях ОС, или даже при самосборке этого компилятора на новой ОС. Данная проблема происходит при сборке GCC на AIX 5.2 при помощи GCC, скомпилированного для AIX 5.1 (или более ранней версии ОС). AIX 5.2 добавляет поддержку функции atoll(), тогда как сборка GCC для AIX 5.1 включает в себя кэшированную версию stdlib.h, которая не содержит прототипа этой функции. Возвращаемое значение непрототипированной функции по умолчанию представлено в типе "int" вместо "long long", из-за чего GCC некорректно конвертирует некоторые строки. Для самонастройки GCC на AIX 5.2, необходимо удалить из GCC "исправленный" заголовочный файл stdlib.h так, чтобы использовался заголовочный файл AIX 5.2. Системный заголовочный файл может использоваться старой сборкой GCC для самонастройки компилятора.

Пример

Ниже представлен пример с достаточно большим размером стека для каждого потока и соответствующим makefile, который GCC использует для компиляции программы, использующей pthreads.

Массив распределен в стеке, а не в секторе данных. Проблема заключена в размере стека для потока. Для увеличения размера стека потока по умолчанию необходимо использовать соответствующие функции pthread. Без #ifdef _AIX программный код будет записан в файл дампа .

$ cat test.c
#include <pthread.h>
 #include <stdio.h> 
#define NUM_THREADS 3
 #define SIZE 100000
 void *PrintHello(void *threadid) 
{ 
double array[SIZE];
 int i;
 for (i = 0; i < SIZE; i++)
	 array[i] = (double) i;
	pthread_exit(NULL); 
}
 int main() {
 pthread_attr_t tattr;
 pthread_t threads[NUM_THREADS];
 int rc, t;
 if (rc = pthread_attr_init(&tattr)) {
	 printf"ERROR: rc from pthread_attr_init() is %d\n", rc); 
	exit(-1); 
  } 
#ifdef _AIX 
 if (rc = pthread_attr_setstacksize
 (&tattr, PTHREAD_STACK_MIN + SIZE *      sizeof(double))) {
	 printf("ERROR: rc from pthread_attr_setstacksize() is %d\n", rc);
	 Exit(-1);
 } 
#endif 
 for (t = 0; t < NUM_THREADS; t++) { 
	printf("Creating thread %d\n", t);
	 if (rc = pthread_create(&threads[t], 
	 &tattr, PrintHello, (void *)t)) {
		 printf("ERROR: rc from pthread_create()
		  is %d\n", rc); exit(-1);         }
 }
 pthread_attr_destroy(&tattr); pthread_exit(NULL);
} 
$ cat Makefile 
host := $(shell uname) 
CC = gcc
 ifeq (,$(findstring CYGWIN,$(host))) 	# not Cygwin
	 LDFLAGS += -lpthread 
endif 
PROGRAM = test
OBJECTS = test.o 
all: $(PROGRAM) $(PROGRAM): $(OBJECTS)
clean: rm -f $(PROGRAM) $(OBJECTS) core tags

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=317613
ArticleTitle=Использование компилятора GNU C/C++ при работе с AIX
publish-date=06302008