問題タブ [c-standard-library]
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.
cmake - 未定義のシンボルは残りますが、共有ライブラリはコンパイルされ、正しく機能しているようです
私の目標は、SUNDIALS 2.7.0から共有ライブラリを構築することでした。これらは、C で書かれた常微分方程式のソルバーです。
ソースをダウンロードし、インストール ガイドに従いました。
- Cmakeを(GUIで)実行し、オプション「CVODE」(これは利用可能なソルバーの1つであり、私が望んでいた唯一のものです)、「共有ライブラリを構築する」および「汎用(std-c)数学ライブラリを使用する」オプションをチェックし、Makefileを生成しました。
- Linux コンソールで実行
make && make install
すると、共有ライブラリが生成され、エラー メッセージはまったく表示されませんでした。出力は次のとおりです。
これらの共有ライブラリは、必要なプロジェクトで適切に機能しているようです。常微分方程式が解かれ、出力は、これらに依存しない他のソルバーと同じように見えます。
しかし、大きな問題が 1 つあります :) : 生成された共有ライブラリで未定義のシンボルをチェックすると、標準関数の短いリストが表示されます。共有ライブラリの出力は次のとおりです。
と
共有ライブラリの依存関係を印刷すると、次のようになります。
と
たとえば、sqrtに対して定義され、実際の数値計算で非常に重要なSUNRsqrtのような関数があります。この事実と、未定義のシンボルの存在により、共有ライブラリの信頼性について混乱し、心配しています。
共有ライブラリを生成する前に、すべての適切なパスを環境変数 LD_LIBRARY_PATH (ちなみに、以前は空でした) に設定しました。
たとえば、C 標準ライブラリlibc.soと C 数学ライブラリlibm.soは/usr/lib/x86_64-linux-gnuに格納されていますが、GNU トランザクション メモリ ライブラリlibitim.soは/usr/lib/gccに格納されています。 /x86_64-linux-gnu (ただし、バージョン 1.0.0 も/usr/lib/x86_64-linux-gnu にあります)。
OS、Cmake、GNU C コンパイラ、GNU Make のバージョン:
どんなコメントでも大歓迎です。
PS このケースは、SUNDIALS 2.7.0 ソース(直接ダウンロード リンク)から共有ライブラリを生成し、未定義のシンボルでそれらをチェックすることがすべてであるため、完全に再現可能です。
c - C99 ネストされた配列の未定義の動作
私たちの講義では、最近、ポインターの等価性に関する c99 標準 (6.5.9.6) を見て、それをネストされた配列に適用しました。そこには、「一方が1つの配列オブジェクトの終わりを過ぎたものへのポインターであり、もう一方が最初の配列オブジェクトの直後にたまたま続く別の配列オブジェクトの開始へのポインターである場合にのみ、ポインターが等しいことが保証されると述べられています。アドレス空間」。
教授は、これが配列アクセス a[0][19] が次元 4*5 のネストされた配列に対して技術的に定義されていない理由であると説明しました。これは本当ですか?もしそうなら、なぜ負のインデックスが定義され、例えば a[1][-1] なのですか?