Вводные замечания
Это ЧаВо составлено на основе актуализированного перевода вопросов и ответов о Sun Studio со страницы Sun Studio FAQ.
Оригинальный FAQ был собран Крисом Квенелли на базе
вопросов и ответов с англоязычного формума по Sun Studio.
Если Вы не нашли ответа на свой вопрос в этом ЧаВо, задайте его на одном из форумов англоязычном или русскоязычном-
все форумы регулярно просматриваются не только инженерами-разработчиками компонент Sun Studio, но и другими пользователями, которые, возможно, уже
решали (и решили) точно такую же проблему.
- Вводные замечания
- Инсталлятор
- Инсталлятор - как установить Sun Studio не из-под root
- Инсталлятор - как деинсталлировать Sun Studio 11
- Инсталлятор - жалобы на libXp.so на 64-битном Linux
- Инсталлятор - нет bash?
- Инсталлятор - не получается заставить работать -nodisplay
- Инсталлятор - как установить Sun Studio на Ubuntu
- Инсталлятор - я удалил все пакеты pkgrm'ом, но все равно не могу переустановить Sun Studio
- Инсталлятор - 0 bytes will be installed
- Общие вопросы
- Общие вопросы - где найти дополнительную информацию?
- Общие вопросы - какие патчи самые свежие?
- Общие вопросы - почему updatemanager не устанавливает патчи Sun Studio?
- Общие вопросы - как сообщить об ошибке в Sun Studio
- Общие вопросы - как мне найти сообщение об ошибке в базе?
- Общие вопросы - работает ли Sun Studio с самой последней версией Solaris?
- Общие вопросы - работает ли Sun Studio с самой последней версией Java?
- Общие вопросы - почему компоненты Sun Studio отсылают почту с моего компьютера?
- Инструменты - IDE
- IDE - Как добавить новый суффикс для файлов исходного кода
- IDE - как увеличить размер шрифта?
- IDE - Sun Studio игнорирует управляющие клавиши
- IDE - ошибка "[: too many arguments"
- IDE - как мне оюновить или конвертировать файлы проектов в Sun Studio 12?
- Инструмента - Dbx
- Dbx - сообщения вида "Mismatched checksum ..."
- Dbx - раздражающая стрелка в конце строки
- Dbx - как работать с Pro*C
- Dbx - стек на x86 выглядит странно
- Dbx - JVM постоянно получает сигнал SIGILL
- Dbx - RTC постоянно выдает ошибки типа RUA на Solaris 10 или OpenSolaris
- Dbx - почему моя программа под dbx ведет себя по-другому?
- Dbx - почему не получается перенаправить вывод команд?
- Компиляторы
- OpenMP - почему циклы не могут содержать вызовы MT-safe функций?
- Компиляторы - Откуда сообщение "language optional software package not installed"?
- Компиляторы - после перехода на DWARF исполняемые файлы стали огромными!
- Компиляторы - почему один и тот же исходный файл порождает разные объектные?
- C++ - у меня проблема с библиотекой Boost
- C++ - почему не найден символ?
- C++ - являются ли стандартные классы thread safe?
- C++ - у меня еще вопросы!
- C - какие макросы определяются компилятором C ?
- Вычисления
- Специфика разных платформ
Инсталлятор
Инсталлятор - как установить Sun Studio не из-под root
Инсталлятор не работает ни под каким пользователем кроме root'а. Однако, можно
использовать rpm2cpio на Linux чтобы распаковать содержимое RPM и поместить распакованное
в любую директорию.
Последние выпуски Sun Studio идут в двух видах - с инсталлятором и в виде архива tar. Можно скачать
последнее и распаковать в любую директорию.
Инсталлятор - как деинсталлировать Sun Studio 11
Из-под root:
% cd /var/sadm/prod/com.sun.studio_11 % ./batch_uninstall_all
P.S. На одном компьютере может быть несколько версий Sun Studio, только они должны быть в разных каталогах (например, /opt/11
и /opt/12).
Таким образом, деинсталлировать предыдущую версию не обязательно, только если Вы не хотите освободить место (~1гигабайт, но сильно зависит от платформы).
Инсталлятор - жалобы на libXp.so на 64-битном Linux
Возможно, Вам придется вручную установить 32-битные библиотеки Motif.
См. Installing Sun Studio on Different Linux Distros
Инсталлятор - нет bash?
Если вы установили Solaris без пакета SUNWbash, скрипт sunstudio не сможет
запустить IDE. Что еще важнее, без этого пакета инсталлятор не станет устанавливать Sun Stduio.
Он может просто зависнуть при отсутствии SUNWbash.
Единственный приходящий в голову способ установить Solaris 8 без bash - это
устанавливать его в минимальной конфигурации. Не стоит этого делать.
Проверить, установлени ли bash, можно следующей командой:
% pkgchk -l -p /usr/bin/bash
Pathname: /usr/bin/bash
Type: regular file
Expected mode: 0555
Expected owner: root
Expected group: bin
Expected file size (bytes): 425948
Expected sum(1) of contents: 49550
Expected last modification: Jan 05 02:21:03 PM 2000
Referenced by the following packages:
SUNWbash
Current status: installed
Если этот пакет отсутствует, Вы сможете установить его с CD2 базовой
установки Solaris 8. Возможно, в первом выпуске Solaris 8 bash остутствовал,
поэтому Вам, возможно, потребуется относительно свежее обновление Solaris 8.
Существует неправильная информация о том, что пакет можно утановить с Companion CD или же
скачать. Это не так. Пакет будет отличаться именем и прочими данными и инсталлятор
все равно не сможет определить наличие bash.
Инсталлятор - не получается заставить работать -nodisplay
О проблеме писали несколько раз, но однозначного решения может не быть.
Вот один из возможных:
http://forum.sun.com/jive/thread.jspa?forumID=309&threadID=96020
От Терри, нашего гуру инсталлятора:
# ./installer -nodisplay
Убедитесь, что $DISPLAY содержит правильное значение. С нужным флажком
инсталлятор все равно запустится в режиме командной строки.
Еще одним вариантом может быть то, что старая версия java у Вас в путях
находится раньше. Попробуйте набрать java -version из-под root и проверить
что выбирается нужная версия (для того чтобы -nodisplay работал
требуется старше 1.4.2). Наконец, если ничего из предложенного не помогло,
запустите
noformat
sh -x ./installer -nodisplay
noformat
и разметсите вывод на форуме чтобы мы смогли найти ошибку в скрипте.
--Terry.
Инсталлятор - как установить Sun Studio на Ubuntu
Sun Studio 12 выходит в двух вариантах – с инсталлятором и в виде пакета
tar.gz. Последний не требует установки - просто распакуйте в каталог по выбору;
первый же содержит rpm-пакеты и Вам потребуется поддержка rpm для того, чтобы
инсталлятор смог сделать свою работу:
[noformat]
apt-get install rpm
ln -s /usr/bin/rpm /bin/rpm
[noformat]
После этого инсталлятор должен заработать.
Спасибо Matt'у: http://forum.java.sun.com/thread.jspa?threadID=5102562
См. также: Installing Sun Studio on Different Linux Distros
Инсталлятор - я удалил все пакеты pkgrm'ом, но все равно не могу переустановить Sun Studio
От пользователя akumta на форуме разработчиков:
Ручное удаление пакетов pkgrm'ом, вероятно, повредило регистр продуктов.
Пожалуйста, посмотрите на раздел Product Registry Problems в руководстве
по инсталлятору: http://docs.sun.com/source/816-7874/troubleshooting.html
Исходная ветка форума здесь: http://forum.sun.com/jive/thread.jspa?forumID=309&threadID=102761
Инсталлятор - 0 bytes will be installed
Вы пытаетесь установить Sun Studio и получаете массу информации,
сходной с приведенной ниже:
Product: Sun Studio Software Location: /u01 Size: 0 bytes ----------------------------
В этом случае вполне вероятно, что вы взяли файлы не для той архитектуры.
Попытка установить продукт для SPARC на машину x86 может привести к подобной
проблеме. Это рассматривается нами как ошибка, проблема должна быть диагностирована
гораздо раньше.
Общие вопросы
Общие вопросы - где найти дополнительную информацию?
Наиболее полная информация о Sun Studio на англ. языке доступна
здесь: http://developers.sun.com/sunstudio.
Недавно начал свою работу и русскоязычный портал разработчиков Sun, на котором
есть раздел о Sun Studio со статьями о компиляторах, средствах отладки, анализа и прочих компонентах Sun Studio; вот, например, краткое введение в OpenMP.
Общие вопросы - какие патчи самые свежие?
Список патчей для Sun Studio 11: http://developers.sun.com/prodtech/cc/downloads/patches/ss11_patches.html
Список патчей для Sun Studio 12: http://developers.sun.com/sunstudio/downloads/patches/ss12_patches.jsp
Если Вы не пользовались инсталлятором, а установили Sun Studio из архива
tar.gz, то для установки патчей придется вручную распаковать патчи и переписать
содержащиеся в нем файлы поверх существующих.
Если срочности с установкой патча нет, можно подождать следующего Express-выпуска
Sun Studio, в который войдут все изменения (в т.ч. патчи), интегрированные на момент выпуска.
См. также Sun Studio Patches
Общие вопросы - почему updatemanager не устанавливает патчи Sun Studio?
updatemanager может выдавать следующую ошибку:
Utility used to install the update failed with exit code {0}.
Эта проблема связана с глобальными зонами и использованием patchadd -G. С патчами
для Sun Studio 12 этой проблемы быть не должно.
Доп. информация здесь: http://forum.java.sun.com/thread.jspa?threadID=5107410
-----------
Новый патч для Solaris 10 patchadd исправляет некоторые из проблем, связанных с установкой
патчей для компиляторов:
6188748 patchadd needs support for patching from NFS filesystems
6374972 patchadd should deal with global-only packages intelligently
В частности, если Вы устанавливаете Sun Studio 11 или 12 на Solaris 10
с единственной (глобальной) зоной, то использоваться patchadd -G для
установки патчей больше не придется.
С патчами 119254-33/119255-33 есть проблема, поэтому пользуйтесь, пожалуйста, ревизией -34 патчей на patchadd.
(Спасибо Томасу Дену)
Общие вопросы - как сообщить об ошибке в Sun Studio
Зайдите на bugs.sun.com, выберите "Report a Bug" в списке под Bug Database справа на странице.
Поставьте галочку под загаловком "Submit a Bug" и нажмите "Start a new Report".
В выпадающем меню Product/Category Вы увидите 8 элементов по числу компонент
под главной – "Sun Studio Compilers and Tools"
- C Compiler
- C++ Compiler
- Fortran
- Dbx
- Performance Analyzer
- IDE
- Dmake
- Other
Вы получите подтверждение и, если ошибка будет принята и занесена в базу,
то и Bug ID для наблюдения за прогрессом.
Общие вопросы - как мне найти сообщение об ошибке в базе?
Сейчас на bugs.sun.com можно искать по ключевым словам и номеру ошибки (bug ID).
Более полная функциональность еще в работе.
Общие вопросы - работает ли Sun Studio с самой последней версией Solaris?
Все компоненты Sun Studio подвергаются тщательному тестированию перед тем, как мы
выпустим финальную версию, однако Sun может тестировать только на тех платформах,
которые существовали на момент проведения тестирования. В целом, Sun пытается исправлять
ошибки, появляющиеся при использовании более свежих версий Solaris и Java, поэтому
всегда имеет смысл сообщить об ошибке и на форуме, и на bugs.sun.com.
Вот список версий Solaris (и Linux), на которых Sun Studio официально тестируется и поддерживается:
http://developers.sun.com/prodtech/cc/support/support_matrix.jsp
См. также: Sun Studio Solaris Issues
Общие вопросы - работает ли Sun Studio с самой последней версией Java?
(См. похожий вопрос про Solaris выше)
Коротко говоря, у Sun Studio 11 есть определенные проблемы с Java 6, однако
Вы с ними можете и не столкнуться. Sun Studio 12 поддерживает Java 6 и
никаких проблем быть не должно.
Что же касается еще более свежих версий - прямой совместимости нет и вполне
вероятно возникновение каких-то проблем с IDE. К компиляторам и отладчику это,
разумеется, не относится (конечно, если Вы не отлаживаете Java-программы с помощью
dbx).
См. также: Sun Studio Java Issues
Общие вопросы - почему компоненты Sun Studio отсылают почту с моего компьютера?
В Sun Studio встроено два механизма, которые уведомляют Sun о том сколько
людей используют Sun Studio и оба этих механизма могут быть отключены.
Более старый метод основывается на посылке email'ов и включается только
в предварительных выпусках Sun Studio (Sun Studio Express). Его можно
отключить установив переменную окружения UT_NO_USAGE_TRACKING в "1".
Новый же базируется на посылке простого пакета каждые два недели или около того
и включается как для предварительных, так и для официальных выпусков. Его можно
отключить установив любое значение переменной SUNW_NO_UPDATE_NOTIFY, кроме "false".
Если sendmail неправильно сконфигурирован, у Вас, возможно, будут проблемы с dbx, отладчиком
Sun Studio. При посылке сообщения он может зависнуть. Если это происходит, просто установите
переменную окружения, указанную ранее.
Новая система с посылкой пакетов используется для того, чтобы понять сколько у нас есть пользователей,
а также дает Вам информацию о наличии обновлений. Подробнее об этом можно прочитать здесь:
http://developers.sun.com/sunstudio/documentation/ss12/release_notes.html#Update
Для Sun очень важно знать какие именно компоненты используются чаще всего и на каких платформах.
Это позволяет решать что именно нужно реализовать в следующем выпуске, так что не выключайте уведомление,
если это возможно. Это будет способствовать поддержке и улучшению инструментов, которые важны для Вас.
Инструменты - IDE
IDE - Как добавить новый суффикс для файлов исходного кода
В Sun Studio 11 не было механизма для добавления новых расширений
в список тех, что считались расширениями для файлов с исходым кодом.
В Sun Studio 12 вы можете пользоваться GUI для добавления новых
расширений. Просто следуйте этому пути:
Tools->Options->Advanced Options->IDE Configuration->System->Object Types
IDE - как увеличить размер шрифта?
От Николая Молчанова:
Попробуйте sunstudio --fontsize 18"
Это изменит размер для всех окон, кроме редактора.
Шрифт редактора можно менять прямо из IDE:
- главное меню: Tools->Options->"Fonts & Colors" (закладка).
IDE - Sun Studio игнорирует управляющие клавиши
Если Sun Studio игнорирует клавиши Del, Backspace и т.п., возможно
Вы используете X-сервер с включенным расширением XKEYBOARD. Это можно
проверить запустив команду
$ xdpyinfo | grep XKEYBOARD
Также возможны проблемы с локалью. Это можно проверить запустив
пример с notepad, который поставляется вместе с J2SE:
$ cd /<java_path>/demo/jfc/Notepad $ java -jar Notepad.jar
Проблема исправлена в Java 6, это целое семейство ошибок.
(информация от Томаса Дена)
Это может быть связано с проблемой с copy/paste: в Java есть
ошибка за номером 6173972, которая исправлена в Java 5.0u3.
Попробуйте обновить версию Java, которую использует Sun Studio
(sunstudio --jdkhome <path>).
Если также простой обходной путь:
(От Фила Р.)
использование более старого инструментария MAWT вместо XAWT
может помочь; нужно просто установить следующую переменную
окружения:
AWT_TOOLKIT=sun.awt.motif.MToolkit
IDE - ошибка "[: too many arguments"
Это происходит в Sun Studio 11 если вывод uname -p содержит несколько слов.
Более свежие версии скрипта sunstudio должны корректно обрабатывать этот случай.
Чтобы обойти эту проблему, Вы можете задавать пользовательскую директорию
вручную:
$ sunstudio --userdir /some/other/dir
http://forum.java.sun.com/thread.jspa?threadID=5105057
IDE - как мне оюновить или конвертировать файлы проектов в Sun Studio 12?
Новая версия Sun Studio - 12 - не поддерживает проекты старых версий (11 и старше).
Jens Siebert написал скрипт на Питоне для разбора файлов проектов, который может
оказаться полезным:
http://home.arcor.de/jsiebert/files/ss12-gtk-project.py
Проверьте указанный выше сайт на наличие обновлений, но на всякий случай скрипт скопирован на
этот wiki: Sun Studio IDE Project Parsing
Оригинальная ветка обсуждения проблемы: http://forum.java.sun.com/thread.jspa?forumID=852&threadID=5181160
Инструмента - Dbx
Dbx - сообщения вида "Mismatched checksum ..."
Почему dbx выводит сообщения вида "Mismatched checksum ..." в процессе загрузки
системных библиотек? Эти сообщения наблюдались практически на всех GNU-системах, включая
Ubuntu (Linux) и Nexenta (OpenSolaris).
Это проблема в несовместимости алгоритмов поиска внешней отладочной информации, реализованных
в dbx и binutils (2.17). Код dbx был исправлен и последний патч для dbx должен устранить
эту проблему.
См. также: ветку форума "Separate symbol files" здесь: http://forum.java.sun.com/thread.jspa?threadID=5072470&tstart=30
Dbx - раздражающая стрелка в конце строки
Что это за стрелка в конце строки? Разве dbx не может редактировать многострочные команды?
При вводе длинной команды, например,
(dbx) /usr/ccs/bin/elfdump /usr/openwin/lib/locale/ja/xlibi18n_ja.so.2 | grep PLTGOT
показывается только ее хвост:
(dbx) /locale/ja/xlibi18n_ja.so.2 | grep PLTGOT <
Можно использовать команду history чтобы посмотреть на введенную команду полностью,
но это неудобно.
Возраст встроенного в dbx ksh дает о себе знать и перенос ввода на следующую строку это
одна из возможностей, которой в нем нет. В перспективе мы хотим обновить или заменить
встроенный ksh чем-нибудь получше. Пока можно использовать эти команды:
(dbx) set +o vi
или
(dbx) set +o emacs
Они отключат редактирование и разрешат перенос командной строки.
Dbx - как работать с Pro*C
Несколько пользователей спрашивало нас о том как заставить dbx (и Sun Studio
вообще) работать с Pro*C:
http://forum.sun.com/jive/thread.jspa?forumID=309&threadID=95976 http://forum.sun.com/jive/thread.jspa?threadID=72482&tstart=30 http://forum.sun.com/jive/thread.jspa?threadID=72483&tstart=30 http://forum.sun.com/jive/thread.jspa?threadID=72478&tstart=30
Последняя ссылка имеет краткое описание общей проблемы с отсутствующими файлами
исходного кода и информацией о номерах строк в dbx и GUI отладчика.
Используйте опцию proc LINES=YES чтобы сгенерировались директивы #line.
См. Pro*C/C++ Precompiler Programmer's Guide – http://www.oracle.com/technology/documentation/index.html
Dbx - стек на x86 выглядит странно
Чтобы получить стек вызовов, используйте опцию -xregs=no%frameptr компиляторов
Sun Studio. Эта опция говорит компилятору какие регистры он может использовать
под переменные программы. Чтобы сохранить указатель рамки процедуры, требуемый ABI,
запретите оптимизатору использовать этот регистр под переменные.
На платформах x64 (или amd64) существует определяемая ABI структура (секция .eh_frame),
которая поддерживает раскрутку стека без использования указателя рамки процедуры. Некоторые
компоненты, такие как dbx и библиотеки поддержки времени исполнения C++, будут использовать
эту информацию, а некоторые - нет.
На 32-битной x86 альтернативные способы раскрутки стека не реализованы и код
следует компилировать с указателем рамки. Единственным способом
включить эту оптимизацию является указание опции -fast, включающей
агрессивную оптимизацию. Если Вам требуется агрессивная оптимизация и Вы
хотите иметь возможность отлаживать код, используйте -fast -xregs=no%frameptr.
Подробнее об этом можно прочитать здесь:
http://blogs.sun.com/roller/page/dew?entry=the_real_story_on_the
Dbx - JVM постоянно получает сигнал SIGILL
Реализация JVM от Sun внутри себя использует несколько сигналов; SIGILL один из
них. Обычно dbx перехватывает сигналы, которые считает интересными для пользователя.
В этом случае следует поручить dbx игнорировать сигнал SIGILL когда вы отлаживаете
JVM. Воспользуйтесь командой dbx ignore sigill.
Dbx - RTC постоянно выдает ошибки типа RUA на Solaris 10 или OpenSolaris
Последний патч для dbx должен решить эти проблемы. См. подробности по этой ссылке: http://blogs.sun.com/dbx/entry/latest_updates_to_run_time
Номер патча 121023-02, номер ошибки - 6372403
Dbx - почему моя программа под dbx ведет себя по-другому?
Dbx имеет некоторое количество побочных эффектов, влияющих на отлаживаемую программу.
См. Dbx Side Effects
Dbx - почему не получается перенаправить вывод команд?
Ожидаемое и желаемое поведение ">" различно в приведенных ниже двух командах:
(dbx) print (j > 5) (dbx) print foo > /tmp/output
Dbx просто не в состоянии сообразить какой вариант подразумевался, поэтому
некоторый команды интерпретируют ">" как оператор C/C++, а некоторые предполагают, что
">" это оператор перенаправления потока. Подробнее об этом можно прочитать во встроенной
в dbx справочной системе; просто наберите help redirection в командной строке dbx.
Компиляторы
OpenMP - почему циклы не могут содержать вызовы MT-safe функций?
Оптимизатор не знает как Вы будете компоновать свою программу.
Само по себе то, что функция называется malloc, не означает, что
после компоновки это будет означать вызов MT-safe функции malloc.
Вы можете сказать компилятору, что не будете подменять
библиотечные функции с помощью опции -xbuiltin (см. руководство
пользователя).
Для определения, является пользовательская функця MT-safe, требуется глобальный анализ.
Можно попробовать опции -xO5 -xipo (или -xipo=2), они могут
помочь добиться желаемого эффекта.
Компиляторы - Откуда сообщение "language optional software package not installed"?
Сообщение идет от "заглушки" /usr/ucb/cc. Не помещайте /usr/ucb в начало
$PATH, переместите этот путь в конец списка.
Компиляторы - после перехода на DWARF исполняемые файлы стали огромными!
См. эту страницу : Dwarf size increase
Компиляторы - почему один и тот же исходный файл порождает разные объектные?
Есть несколько опций, использование которых делает локальные символы глобальными.
Когда компилятор делает это, ему приходится добавить некий префикс для того, чтобы имена
не совпали.
См. страницу : Compiler Globalization
Также в отладочную информацию попадает дата компиляции - если Вы компилировали
с -g. Удаление символов с помощью strip уберет эту разницу, но не скажется
на эффекте от глобализации.
C++ - у меня проблема с библиотекой Boost
См. сюда : Boost and Sun Studio
C++ - почему не найден символ?
Иногда программа на C++ не линкуется из-за отсутствующего символа, при этом
символ кажется уже определенным. Стив Клэмэдж сделал хорошее резюме возможных
причин:
Наиболее частая причина отсутствующей функции в том, что нужная библиотека не
прилинкована или определение функции оказалось под #ifdef, который не был
определен.
Еще одним из вариантов является разные объявления функции в разных местах
исходного кода. Несколько примеров:
1. Объявление функции в заголовочном файле выглядит так:
int cleanupConfig(_config*);
А определение так:
int cleanupConfig(const _config*) { ... }
2. Где-то функция объявляется как inline, а где-то - нет. Встречается такой код:
INLINE int foo(int i) { ... }
где INLINE это макро, раскрывающееся либо в inline, либо в пустую строку. Если INLINE
неодинаково определен для каждого объявления этой функции foo, Вы получаете
несовместимые объявления, что ведет к проблемам при компоновке.
3. Параметр функции объявлен через typedef:
typedef _config cleanup_kind;
int cleanupConfig(cleanup_kind*);
а определение cleanup_kind не везде одинаково.
4. Функция объявлена в глобальной области видимости, а определение дано внутри
namespace'а.
C++ - являются ли стандартные классы thread safe?
Другими словами, можно ли использовать, например, std::list (из Cstd или STLport)
в многопоточной программе?
Да, но только каждый вызов компилятора должен включать опцию -mt, как при компиляции, так и
при компоновке программы.
"Thread safe" означает, что не нужно беспокоиться о возможности одновременной
модификации внутреннего состояния объектов (или разделяемого объектами) несколькими потоками.
Доступ же к самим объектам нужно ограничивать как обычно - одновременный вызов push_back()
у списка двумя потоками приведет к непредсказуемым результатам.
C++ - у меня еще вопросы!
Есть хорошее FAQ на английском языке: http://developers.sun.com/sunstudio/documentation/ss12/mr/READMEs/c++_faq.html
C - какие макросы определяются компилятором C ?
От Дугласа:
Используйте опцию -### (или -xdryrun) чтобы получить подробный список
опций -D, которые передаются компилятору C.
Вот список предопределенных макросов, требуемых стандартом ISO C, которые не
передаются компилятору C драйвером (cc), а встроены в сам компилятор:
__STDC__ Linux: always expands to 1
......................Solaris: expands to 1 with -Xc
.....................................expands to 0 with -Xa, -Xt
.....................................not defined with -Xs
__STDC_VERSION__ Expands to 199901L with -xc99=all
.....................Expands to 199409L with -xc99=none
.....................Not defined with -Xs option
__STDC_IEC_559__ Expands to 1
__STDC_IEC_559_COMPLEX__ Expands to 1
__STDC_HOSTED__ Expands to 1
Для компилятора C++ можно воспользоваться опцией -V, которая дает приблизительно
те же результаты и позволит увидеть список предопределенных макросов.
Вычисления
Вычисления - почему 0.1 + 0.7 = 0.70000004, а не 0.7?
Вычисления с плавающей точкой всегда имеют определенную погрешность, которую
нужно учитывать. Эта погрешность становится еще более явной, если сравнивать
результаты вычисления на разных платформах, используюя разные компиляторы и
библиотеки (среды выполнения).
Подробный и длинный ответ на этот вопрос есть в статье
Floating-Point Computing: A Comedy of Errors?.
Наиболее полным источником информации в этой области служит
Numerical Computation Guide.
Более короткий - от Боба Корбета (rpcorbett) -
в этой ветке форума: http://forum.java.sun.com/thread.jspa?threadID=5233065
Специфика разных платформ
Linux - странное предупреждение о разделяемой библиотеке (shared object)
% cc -g -xdebugformat=dwarf r.c "r.c", line 4: internal compiler error: DBGGEN ERROR: FILE="../src/dbg_libdwarf.c", LINE=46, Could not load dwarf library: libdwarf.so : libdwarf.so: cannot open shared object file: No such file or directory (DBG_GEN 5.1.11) cc: acomp failed for r.c
Вероятно, Вам нужен патч, исправляющий поведение вызова dlopen(). См. http://blogs.sun.com/roller/page/quenelle?entry=linux_compilers_require_a_glibc
Linux - компоновщик не устает повторять "mangled line number section"
Я постоянно получаю сообщения вроде этого: pcsLP.o(.text+0x4167)/usr/bin/ld: Dwarf Error: mangled line number section. : In function `unsigned long PcsPtrace::get_rtld_base_addr(char*)': : warning: the use of `tmpnam' is dangerous, better use `mkstemp' Это случается когда линкер пытается найти строку/файл, соответствующую некой ошибке линковки. В результате видна только жалоба на информацию о номерах строк, в то время как линкер пытается сообщить о другой ошибке. Это похоже на ошибку в GNU ld, исправленную 6го марта. Исправление показано в ревизии 1.86 файла dwarf2.c в пакете binutils: http://sourceware.org/cgi-bin/cvsweb.cgi/src/bfd/dwarf2.c?cvsroot=src Предполагаю, что симптом исчезнет в следующих версиях GNU ld.
В некоторых случаях компиляторы Sun Studio 12 на Linux используют свою
копию GNU ld при компоновке Вашей программы. Версия ld, включенная в
Sun Studio, выбрана в соответствии с поддерживаемыми нами платформами и
несколько устарела. Вы можете попытаться указать компиляторам Sun Studio
использовать локальную версию компоновщика, если у Вас установлена более
поздняя его версия.
Для C++, укажите CC -Yl,/usr/bin чтобы использовать системный компоновщик.
Использование системного компоновщика это обычный случай; кажется, только C++
использует собственный компоновщик чтобы быть уверенным, что группы секций COMDAT
обрабатываются верно (эти секции мы используем для инстанциированных шаблонов).
Это сообщение исходит от компоновщика, так как он пытается использовать информацию
Dwarf чтобы конвертировать адрес ошибки в номер строки в файле исходного кода. Это
крайне умно и полезно когда работает, но если компоновщик встречает нечто, что
он считает ошибкой в данных Dwarf, он выплевывает такое предупреждение.
Linux - проблема с линковокой с libm.so
У C++ были проблемы с компоновщиком по-умолчанию на RH4, который не был способен обрабатывать
наши объектные файлы из-за своих собственных ошибок. Именно поэтому мы берем с собой наш собственный, обновленный,
компоновщик (.../prod/lib/amd64/ld) и используем его при 64-битной компиляции.
У C такой проблемы нет и не было, поэтому собственный компоновщик и не используется.
Многие версии Linux'а (RH5, SuSe 10 и др.) изменили формат своих объектных файлов, что заставляет наш "устаревший"
компоновщик выдавать сообщения вида "file not recognized". Типичное сообщение выглядит так:
$ CC -m64 hello.c /usr/lib64/libm.so: file not recognized: File format not recognized
но это не ограничено только libm.so.
Исходный код заплатки к компоновщику можно найти здесь: http://javashoplm.sun.com/ECom/docs/Welcome.jsp?StoreId=8&PartDetailId=SS12-SRCID-MAY07-G-F&TransactionId=Try
В этих ветках форума есть дополнительная информация: http://forum.java.sun.com/thread.jspa?forumID=850&threadID=5181629 http://forum.java.sun.com/thread.jspa?forumID=855&threadID=5178078
Linux - sunstudio – too many arguments
sunstudio: line 293: [: too many arguments -- Gentoo AMD64 Error: client VM not supported
Это происходит, если вывод uname p содержит пробелы. Если передать параметр -userdir
скрипту sunstudio, то этот параметр сделает ненужным вызов uname -p и все должно работать.
http://forum.sun.com/jive/thread.jspa?forumID=318&threadID=105057
Linux - sunstudio – На 64-битном Linux IDE падает с UnsatisfiedLinkError
java.lang.UnsatisfiedLinkError: /opt/sun/sunstudio11/prod/lib/libbase.so: /opt/sun/sunstudio11/prod/lib/libbase.so: ... <more stack trace> ...
Sun Studio IDE пытается запуститься используя 64-битную JVM. Однако,
Sun Studio требуется загрузить и "нативные" библиотеки, которые в версии 11
были доступны только в одном - 32-битном - варианте. В последней версии этой
проблемы быть не должно, так как Sun Studio 12 поставляется как с 32-, так
и с 64-битными библиотеками для IDE.
Пользователь geo.mac описывает способ обойти проблему в этой ветке форума: http://forum.sun.com/jive/thread.jspa?threadID=106103&tstart=0