問題タブ [dynamic-linking]
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.
linux - どの ELF 依存関係が満たされていないかを見つけるにはどうすればよいですか?
LSB SDK を使用してテスト ELF プログラムを作成しました (私の質問は LSB に固有のものではないことに注意してください)。
しかし、私はそれを起動できません (はい、ファイルがディレクトリにあることを保証します... ):
満たされていないELF依存関係があると思いますが、それを見つける方法がわかりません。ミッシングリンクを見つけるために使用できるライブラリ用の ldd に似たツールはありますか?
LSB コンパイラが動作しているため、2.6.15/2.6.28-15 の違いとは関係ないと思います。
念のため、a.out の ELF 動的セクションを次に示します。
visual-c++ - アプリケーションが静的および動的にリンクされたCRTを混合する理由をどのように見つけることができますか
続く長い投稿でごめんなさい。
Microsoftが提供する静的リンクと動的リンクのCランタイムとC++ランタイムを混在させるのは良い考えではないことを私は知っています。残念ながら、私たちのアプリケーションはすでにそれらを混ぜ合わせており、それを修正しようとしています。さまざまな理由(MSIに慣れていないこと、MSMを十分にサポートしていない可能性のあるNSISを使用していること、時間とリソースの不足など)により、CRTを動的ではなく静的にリンクすることにしました。これが良い考えではない理由は知っていますが、今のところ私たちが選んだのです。
私たちのコードは、ほとんどが標準のC ++であり、他の多くのオープンソースライブラリによって補完されています。
アプリケーションの構造は次のとおりです。静的ライブラリを生成するさまざまなモジュールは、それ自体がリンクされてさまざまなものを作成し、その中で1つの実行可能ファイルが問題を引き起こします。
リリースでは、すべてのコードを/MTでビルドします。一部のオープンソースライブラリでは、プリコンパイルされたバイナリを使用し、一部は/ MDでプリコンパイルされたdllであったため、ランタイムが混在していました。そこで、それらを/ MTで再コンパイルし、dllではなく静的ライブラリを作成しました。この変換はライブラリごとに行われないため、/MDを使用するいくつかのdllとリンクします。
その結果、depends.exeでは、1つの実行可能ファイルを除くすべてのものがmsvcr80.dllまたはmsvcp80.dllに直接依存していません。直接依存しないということは、msvcr80.dllがdepends.exeによって示されるツリーのルートの子ではないことを意味します。ライブラリdllの1つによってプルされたmsvcr80.dllが見つかることもありますが、それはツリーのより深いレベルです。
その1つの厄介な実行可能ファイルの最初のレベルにmsvcr80.dllがある理由を知るにはどうすればよいですか?その実行可能ファイルをmsvcr80.dllに直接リンクする理由は何ですか?
1つの理由は、リンクが/MDを使用してCRTと動的にリンクするライブラリAに静的にリンクしていることである可能性があります。したがって、ライブラリAのコードは実行可能ファイルに含まれるため、実行可能ファイルはmsvcr80.dllにリンクします。しかし、どのライブラリがそれを行っているかをどのように知ることができますか?
私がこれまでに試したこと:
- 静的にリンクされた.libファイルをdepends.exeにロードする->depends.exeは静的ライブラリではなく実行可能ファイルまたはdllを想定しているため、機能しません
- 静的にリンクされた.libファイルでdumpbin.exe/DIRECTIVESを使用します->それらのいずれもmsvcrt80.dllを表示しませんでした(デバッグ中、すべてに/ MDdを使用しようとすると、msvcrt80d.dllが表示されたため、メソッドは良いです。静的にリンクされたすべてのオープンソースライブラリが/MTで正しくコンパイルされていることを証明します)
- / VERBOSE:LIBリンカーフラグを使用します->実際にmsvcr80.dllのインポートライブラリであるmsvcrt.libをプルしていることを示したため、問題が発生しましたが、なぜそれが行われているのかはわかりませんでした
- VisualStudioで/VERBOSEリンカーフラグを使用します+追加の依存関係libcmt.lib+すべてのデフォルトライブラリを無視しますYES+特定のライブラリを無視します:msvcrt.libを削除するか、誰がそれをプルするかを確認するために必死に試みます。結果は私を困惑させました:
私が理解している限り、libcmt.libのtypinfo.objはシンボルを参照し、msvcrt.libで検索し、ti_inst.objで見つかった後、2回定義されているというエラーをスローします。しかし、これは意味がありません。libcmt.libにすでにシンボルがある場合、なぜmsvcrt.libでそれを検索し、実行可能ファイルにmsvcr80.dllをもたらすのでしょうか。そして、より一般的には、静的ライブラリが動的インポートライブラリでシンボルを検索するのはなぜですか?Ignore固有のライブラリにmsvcrt.libがある場合、リンカがmsvcrt.libを参照するのはなぜですか?
お待ち頂きまして、ありがとうございます :-)。
linux - Googleperftoolはファイル「libprofiler.so.0」を読み取ることができません
CPU時間プロファイリング用のGoogleパフォーマンスツールを試しています。しかし、共有ライブラリファイル「libprofiler.so.0」が読み取れないという問題が発生しました。
グーグルパフォーマンスツールのREADMEを読みました。マニュアルには3つのステップがあります。
プログラムをでコンパイルし
-lprofiler
ます。私はこの部分を問題なく実行しました。プログラムのバイナリを実行して、プロファイル結果ファイルを生成します。
私はこのステップで失敗しました。バイナリを実行しようとすると、次のエラーメッセージが表示されます"error while loading shared libraries: libprofiler.so.0: cannot open shared object file: No such file or directory."
。
私はグーグルで検索しましたが、このページで誰かがにいると言ったので、共有ライブラリファイルをバイナリのあるディレクトリにコピーして、バイナリを実行しようとしました。それでも同じエラーメッセージが報告されます。"libprofiler.so.0"
"/usr/local/lib"
Linuxを約1年間使用したばかりですが、私の質問が非常に愚かである場合はご容赦ください。そして、よろしくお願いします。
私のマシン情報:
- OS:Ubuntu 8.10
- コンパイラ:gcc 4.3.2
- シェル:bash
- グーグルパフォーマンスツールバージョン:1.4(私はちょうど今日それをダウンロードしました)
c - -symbolic と -shared GCC フラグの違いは何ですか?
ドキュメントの説明から、「すべてのシステムではなく」共有をサポートし、「一部のシステムのみ」がシンボリックをサポートすることを除いて、それらは同じことをしているようです(これらが同じシステムのセットであるかどうかは不明です):
-shared 他のオブジェクトとリンクして実行可能ファイルを形成できる共有オブジェクトを生成します。すべてのシステムがこのオプションをサポートしているわけではありません。予測可能な結果を得るには、このオプションを指定するときに、コードの生成に使用されたのと同じ一連のオプション (-fpic、-fPIC、またはモデル サブオプション) も指定する必要があります。[1]
-symbolic 共有オブジェクトを構築するときに参照をグローバル シンボルにバインドします。未解決の参照について警告します (リンク エディター オプション -Xlinker -z -Xlinker defs によってオーバーライドされない限り)。このオプションをサポートするシステムはごくわずかです。
違いは「他のオブジェクトとリンクして実行可能ファイルを形成できる共有オブジェクトを生成する」部分にあると思いますが、それはどのライブラリにも当てはまるように思えます。結果の共有オブジェクトも静的にリンクできるということですか?
.net - Mono アプリから C++ モジュールを使用する方法
Windows で開発した C#/C++ アプリを Linux で実行しようとしています。
その一部である FooLib は、パフォーマンスのために C# からピンボークされた C++ で記述されています。FooLib はシステム コールを使用せず、標準の C++ 機能のみを使用します。次のように宣言された単一の関数をエクスポートします。
Visual C++ でコンパイルされています。Windows でコンパイルされた FooLib.dll を使用して mono でアプリを実行しようとしましたが、dll の読み込み (DllImport) が次のエラーで失敗しました。
それで、私は何をすべきですか?
- 何らかの方法でエクスポート宣言を変更しますか?
- Linux で gcc を使用して .so ライブラリにコンパイルし、それをロードしますか?
- Linuxでgccを使用して.dllにクロスコンパイルしてからロードしますか?
- 他の何か?
gcc - ライブラリ名からライブラリのファイル名を見つけるにはどうすればよいですか?
ライブラリ名からライブラリのファイル名を見つけるにはどうすればよいですか?
つまり、「-lc」を使用すると、それが /lib/libc.so.6 (または同様のもの) であることがわかります。「-lc」が入力で「/lib」のコマンドを入力できるようにしたいのです/libc.so.6" が出力されます。このアイデアをさらに拡張するために、独自の検索パスを指定して、このライブラリ リゾルバーをさまざまなツールチェーンに使用できるようにしたいと考えました。
ありがとうチェンツ
mysql - MacPorts を使用して動的ライブラリをダウングレードするにはどうすればよいですか?
libmysqlclient_r.15.dylib
に置き換えたMySQLをアップグレードしたため、私のpy-mysqlはうまくいきませんlibmysqlclient_r.16.dylib
。古いバージョンを見つけて元に戻すにはどうすればよいですか?
編集: MySQL の古いバージョンをインストールするには、@ を実行する必要があることがわかりましたが、古いバージョンを見つける方法をまだ探しています。
dynamic-linking - libtoolはどのようにして共有ライブラリを構築するかどうかを決定しますか?
libtoolはどのようにして共有ライブラリを構築するかどうかを決定しますか?
チェンツ
c# - dll なしで exe ファイルを実行しようとしたときにエラー メッセージを表示するにはどうすればよいですか?
参照によって追加された dll を持つ C# アプリケーションがあります。(コンパイル後に) Windows から exe ファイルを実行しようとして、dll の名前が変更されたときに、アプリケーションにエラー メッセージを表示させたいと考えています。
どうすればコードでそれを行うことができますか?
c++ - クロスプラットフォームのインプロセス動的ライブラリバインディング(つまり、軽量で高性能なCOMまたはCORBA)用のC++ラッパーの推奨事項
私たちは、アプリの利用者が独自のアルゴリズムを提供できるようにするプラグイン「アーキテクチャ」を備えたアプリケーションを開発しています。(基本的にパーサーのセットがあり、サードパーティが独自のパーサーを提供できるようにします)
ドメインスペースには非常に高いパフォーマンスが必要なため、アウトプロセスバインディングは機能せず、CORBAやCOMなどの重いものはそのままにしておきます。
基本的に、次のような単純なクロスプラットフォームラッパーを探しています。
- 相対パスからライブラリをロードする
- 特定のdll/.soのいくつかの構成/名前へのマッピングを提供します
- 初期化を行い、ライブラリにクエリを実行して、必要な機能が提供されていることを確認します
これは実際にはloadlibrary()とエクスポートされたメソッド呼び出しをラップアラウンドするだけだと思います。これは自分で書くこともできますが、十分な数があるので、既存のコードを使用したいと思います。
繰り返しますが、スループットとパフォーマンスは非常に重要です。
同様の質問は次のとおりです。
COMのクロスプラットフォームの代替手段-これは近いですが、インプロセスのみが必要です-アウトプロセスの必要はなく、私たちのニーズは少し「軽量」です。
C++クロスプラットフォームダイナミックライブラリ; LinuxとWindows
これはアンマネージC++用です-.NETは使用できません
編集-私たちが見つけたもの
Pocoは私たちのニーズに最適であることがわかりました。ボーナスとしてこのページは、C++開発の状態と言語の方向性について非常に高く評価されているコメントです...
Pocoが提供する必要があったのは、単純なクロスプラットフォームラッピングでした。実際にはそれほど多くはありませんが、それでも時間とテストを節約できます。実行時に追加のオーバーヘッドはありません。