問題タブ [solaris-studio]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - これは、Solaris Studio のマングリング バグですか?
ソース(質問の最後)は、Solaris Studio(他のコンパイラではなく)でのマングリングエラーであると私が信じているものを引き起こします。
わかりやすくするために、エラー メッセージは新しい行で再フォーマットされました。
2 つの関数 runGenEntries の最初のパラメーターが 1 文字 (Rule の末尾の「s」) だけ異なることに注意してください。
これは、最初のパラメーターのタイプが次の場合に発生するようです。
また、最初のパラメーターがタイプの代わりにある場合は発生しません:
最終的に同じタイプに解決されます。
これは、Solaris だけに実装されているあいまいな C++ ルールの結果ですか? それとも、シンボルをマングルするときの Solaris Studio のバグですか?
完全なソース
次のソースは、どのコンパイラでもそのままコンパイルできます。
定義は、エラーを引き起こすコードをアクティブにするか、同じ結果を生成するはずのコードをアクティブにします (ただし、今回はバグなし):
このコードは、次のプラットフォームでコンパイルされました。
c++ - std::string::basic_string(std::istreambuf_iterator に一致するものが見つかりませんでした>、std::istreambuf_iterator
次の無害な関数は、Solaris Studio 12.3 でコンパイルに失敗します。
#undef _RWSTD_NO_MEMBER_
次の無害な関数は、Solaris Studio 12.3 でコンパイルに失敗します。
エラーメッセージで失敗します
std::string::basic_string(std::istreambuf_iterator<char,
std::char_traits<char>>, std::istreambuf_iterator<char,
std::char_traits<char>>)
で必要な に一致するものが見つかりませんでし
たOOTest::FetchData(const std::string
&)
。
今、ファイルを確認したstd::string
ところ、次のことがわかりました
std::string
だから、オーバーロードの宣言があると思います
どれが合っていたはず
しかし、残念ながらそうではありませんでした。
だから私は2つの質問があります
std::istreambuf_iterator<char>
私のコンストラクション ビアが一致しないのはなぜですか?
- このマクロ
_RWSTD_NO_MEMBER_TEMPLATES
の目的は何ですか?
ノート
- コメントをもとに実行してプリプロセッサ出力を生成しようとした
CC -E test.cpp > pre.out
ところ、イテレータ版が生成されていませんでした。だから私は定義を解除しようとしまし_RWSTD_NO_MEMBER_TEMPLATES
たが、それは役に立ちませんでした。
POM から直接実行する方法はわかりませんが、いつでも Java メイン クラスを作成し、 pom を読み取り、必要な依存関係を追加し、すべての詳細を含む新しい POM ファイルを出力できます。
バージョンの詳細を取得するには、rest API を使用します。
http://search.maven.org/#api
例
http://search.maven.org/#search|gav|1|g :"com.google.inject"%20AND%20a:"guice"
groupId「com.google.inject」およびartifactId「guice」のすべてのバージョンのリンクをクリックすることを模倣します。アーティファクトのすべてのバージョンのソートされたリストを返します。
次の無害な関数は、Solaris Studio 12.3 でコンパイルに失敗します。
#undef _RWSTD_NO_MEMBER_
次の無害な関数は、Solaris Studio 12.3 でコンパイルに失敗します。
エラーメッセージで失敗します
std::string::basic_string(std::istreambuf_iterator<char,
std::char_traits<char>>, std::istreambuf_iterator<char,
std::char_traits<char>>)
で必要な に一致するものが見つかりませんでし
たOOTest::FetchData(const std::string
&)
。
今、ファイルを確認したstd::string
ところ、次のことがわかりました
std::string
だから、オーバーロードの宣言があると思います
どれが合っていたはず
しかし、残念ながらそうではありませんでした。
だから私は2つの質問があります
std::istreambuf_iterator<char>
私のコンストラクション ビアが一致しないのはなぜですか?
- このマクロ
_RWSTD_NO_MEMBER_TEMPLATES
の目的は何ですか?
ノート
- コメントをもとに実行してプリプロセッサ出力を生成しようとした
CC -E test.cpp > pre.out
ところ、イテレータ版が生成されていませんでした。だから私は定義を解除しようとしまし_RWSTD_NO_MEMBER_TEMPLATES
たが、それは役に立ちませんでした。
POM から直接実行する方法はわかりませんが、いつでも Java メイン クラスを作成し、 pom を読み取り、必要な依存関係を追加し、すべての詳細を含む新しい POM ファイルを出力できます。
バージョンの詳細を取得するには、rest API を使用します。
http://search.maven.org/#api
例
http://search.maven.org/#search|gav|1|g :"com.google.inject"%20AND%20a:"guice"
groupId「com.google.inject」およびartifactId「guice」のすべてのバージョンのリンクをクリックすることを模倣します。アーティファクトのすべてのバージョンのソートされたリストを返します。
c++ - C++ プリプロセッサは、可変個引数マクロの呼び出しで空白を削除します (Solaris Studio 12.3)
Oracle Solaris Studio 12.3 の C++ プリプロセッサは、展開時に空白を完全に削除します__VA_ARGS__
。
システムでこの動作を確認できる人はいますか? それは既知のコンパイラのバグですか? この問題の回避策はありますか?
説明のために、簡単なテスト プログラムを次に示しますvaargs.c
。
C プリプロセッサは期待どおりに動作します。
ただし、C++ プリプロセッサは「hello」と「world」の間のスペースを削除します。
c++ - Oracle Solaris Studio 12.3 を使用して Solaris 10 で libpqxx-4.0.1 をコンパイルしようとするとエラーが発生する
問題の説明
Solaris Studio 12.3 を使用して、Solaris 10 で libpqxx-4.0.1 をコンパイルできません。
バックグラウンド
libpqxx が必要になったときに私が最初にしたことは、 を使用して OpenCSW で検索することでした/opt/csw/bin/pkgutil -a libpqxx
。ただし、OpenCSW のパッケージはバージョン「5.0,REV=2012.05.06」としてリストされて
おり、OpenCSW Web サイトのCSWlibpqxx5-0を見ると、これが古くて不安定なスナップショットであることが示されているようです。安定版が欲しいです。
libpqxx Web サイトから libpqxx-4.0.1.tar.gz をダウンロードしてコンパイルしました。g++
私はそれと他のツールを持っていたので、それはでコンパイルされました$PATH
。出来た。すべてが順調に進んでいました。SELECT
データベースなどからできました。
次に、コードにとって最も重要な段階に到達しました。独自の C++ API と通信します。g++
この API のライブラリへのリンクを試みた後、私のコードは でコンパイルできなくなりました。API には、私が以前に を使用してコンパイルした例が含まれていCC
ます。例は、 を使用してコンパイルされません
g++
。CC
を使用する代わりに、 を使用してコードをコンパイルする必要があると考えましたg++
。私のコードは、を使用してコンパイルされませんでしCC
た。g++
コンパイルされた libpqxx-4.0.1 にCC
は気に入らないものがありました。
CC
したがって、を使用する代わりに、も使用して libpqxx-4.0.1 をコンパイルする必要があると判断しg++
ました。
実行した手順
誤って設定された可能性のある環境 (2012 年からシステムで自分のアカウントを使用しており、時間の経過とともにさまざまな環境変数などが蓄積された) によって引き起こされる問題を排除するために、クリーンなホーム ディレクトリを使用してシステムに新しいユーザーを作成しました。
以下は、ビルド エラーに至るまでの、次に行ったことのトランスクリプトです。
-bash-3.2$ pwd
-bash-3.2$ ls -al
-bash-3.2$ /usr/sfw/bin/gtar xf libpqxx-4.0.1.tar.gz
Solaris 10の Python 2.4.6/usr/bin/python
はスクリプトに問題があったため、迅速で汚いパッチを適用しました。
-bash-3.2$ diff libpqxx-4.0.1/tools/splitconfig splitconfig
-bash-3.2$ cp splitconfig libpqxx-4.0.1/tools/
$PATH
この時点で私のはただ/usr/bin
です。
-bash-3.2$ echo $PATH
が必要ld
です。にあります/usr/ccs/bin
。
-bash-3.2$ export PATH=$PATH:/usr/ccs/bin
CC
は Oracle Solaris Studio 12.3 のものです。(詳細については、見出しの追加情報を参照してください。)
-bash-3.2$ which CC
-bash-3.2$ cd libpqxx-4.0.1
-bash-3.2$ ./configure --prefix=/var/tmp/build/install_test --enable-shared --enable-documentation
make
from/usr/ccs/bin
は以前にビルドできなかったので、今度は
dmake
Oracle Solaris Studio 12.3 から使用してみます。
-bash-3.2$ which make
-bash-3.2$ which dmake
-bash-3.2$ dmake
追加情報
-bash-3.2$ cat /etc/release
-bash-3.2$ /usr/bin/version
-bash-3.2$ pkgchk -l -p /usr/bin/CC
-bash-3.2$ pkginfo | grep SPRO
c++ - コンパイラに依存しない C++ ライブラリを構築する方法 (Solaris Studio および gcc 用)?
現在 gcc を使用してのみコンパイルしているライブラリを、Solaris Studio でも使用できるように拡張したいと考えています。
私の考えは、次のことを行うことです。
- extern Cリンケージを使用してインターフェースの関連部分を公開するラッパー関数を C で作成します。
- 次に、gcc を使用してこのライブラリをビルドします。結果の c ヘッダーとバイナリは、名前マングリングがなくなったため、コンパイラに依存しません。
- Solaris Studio でコンパイルされたプロジェクトに c-header とリンクを含めます。
質問: これは実行可能なアプローチですか、それともこの問題に対するより良い解決策はありますか?
注: 名前マングリングの他に、例外処理に関連する問題にも注意してください。
c++ - Solaris Studio 12.4 コンパイラを使用して Boost V1.57 をビルドする方法
Intel Solaris V11.2 プラットフォームで最新の Solaris Studio 12.4 コンパイラを使用して Boost V1.57 を構築しようとしました。エラーをOTN 開発フォーラムに投稿しようとしましたが、単純な OTN アカウントでは新しい投稿を追加できないことがわかりました。したがって、SOへの質問。
簡単な要約: 1) ブートストラップは成功しました:
2)コマンドラインを構築します(私が入れたことに注意してください とb2
コンパイラPATH
)。これは「ステージ」ビルドです。つまり、インストール手順はありません。すべてのライブラリをビルドできることを確認するだけです。
エラーの圧縮リストを次に示します。
Boostライブラリなしで深刻なC++プロジェクトを想像することはほとんどできないので、IMOのまともなC++コンパイラはBoostを構築できるはずです。それで、BoostまたはSolaris Studioの開発者がこれを読んで、いくつかのパッチを手伝ってくれるかどうか疑問に思っています...
ヒントをありがとう!
c++ - constness の追加が無効ですか? エラー: char** を使用して const char** を初期化することはできません
Solaris Studio は、最も不可解なエラー メッセージを生成しています。
エラーメッセージは次のとおりです。
161 行目: エラー: char** を使用して const char** を初期化することはできません。
constnessを追加することが問題になるのはなぜですか? 行き詰まっています、助けてください...
ポインター char* inbufptr は配列の先頭を指し、何かを一定に保つことを約束しません。
ポインター char const **inbufptr_pos がある場合、この型は配列の内容を変更しないことを約束しますが、ポインターが指す場所を変更することはできます。私がそうしても、配列は変更されておらず、問題はありません。
c++ - LP64 でポインター値を変更する C++ 参照渡し。何を見ればいいですか?
私は synergy-project.org の古いリビジョン (1.3.4) の奥深くにいて、Solaris Studio 12.4 でビルドしています-m64 でのコンパイルとリンク。これがなぜ厄介なのかを理解するために、ビルドフラグなどで何を見ることができますか? 以下のログでは、プログラムは関数内でブレークポイントが設定されており、間違ったポインターが表示されています。その親 (スタックの「上」) には正しいデータがあります。
コード:
... m_parser は次のように解決されます。
... 通信プロトコルが進むにつれて m_parser がどのようにリロードされるかに注目してください。
関数へのステップインに関する質問への回答: 関数へのエントリ時に壊れ、関数がすぐにクラッシュします。「parseHandshakeMessage() を handleData() にハードコーディングすると、正しく動作します。ただし、このシステムには、正しく動作するために関数ポインターに依存する他の例があります。コンパイル フラグを投稿する場合がありますが、それらは冗長で広範囲です。