問題タブ [static-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.
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を参照するのはなぜですか?
お待ち頂きまして、ありがとうございます :-)。
gcc - #pragma comment(lib, "xxx.lib") は Linux で同等ですか?
という名前の静的ライブラリ ファイルがあります。ライブラリへのリンクにlibunp.a
使用できることはわかっています。gcc -lunp xx
#pragma comment(lib,"xxx.lib")
Microsoft C/C++ コンパイラにライブラリを含めるように指示するために使用できます。Linux/GCCでどうすればいいですか?
c - コンパイル中にlibeventをgccと静的にリンクする方法は?
私は自分のプロジェクトで event.h を使用しましたが、それを実行する必要があるサーバーはそれをサポートしていません。また、私もそれをインストールすることはできません。最小限の変更でプロジェクトを実行する方法はありますか?
静的にリンクしてコンパイルする必要がありますが、どうすればよいですか?
iphone - XCode for iPhone でさまざまなビルド プロファイル用にさまざまなプリコンパイル済みライブラリをリンクするにはどうすればよいですか?
私のクライアントは、blah-device.a と blah-simulator.a という 2 つのコンパイル済みライブラリを提供しています。デバイス コンパイル モードで blah-device.a を使用し、シミュレータ コンパイル モードでシミュレータを使用するように xcode に指示するにはどうすればよいですか?
私のクライアントは私にこれらの指示を与えます
- [グループとファイル] パネルで [ターゲット] グループを開き、プロジェクト アイコンを右クリックして、[追加] > [既存のフレームワーク] を選択します。
- [リンクされたライブラリ] セクションで、[ライブラリを追加] アイコン (+) アイコンをクリックし、[その他を追加] をクリックします。
- blah-device.a (iPhone デバイスで直接開発する場合) または blah-simulator.a (iPhone シミュレーターで開発する場合) のいずれかを選択し、[追加] をクリックします。
既にヘッダー ファイルをそこにコピーしましたが、これらの手順ではさまざまなプロファイルを簡単にビルドすることはできません。
DEVICE プロファイルを使用してビルドする場合は Xcode に blah-device.a をリンクさせ、SIMULATOR プロファイルを使用してビルドする場合は blah-simulator.a をリンクさせるにはどうすればよいですか?
どんな助けでも大歓迎です。
windows - Linux および Windows での実行可能ファイルのシンボルに対するロード可能なプラグインのリンク
ロード可能なプラグインをバンドルとして作成し、ホスト実行可能ファイルでシンボルを使用することは、Mac に非常に適しています。Linux と Windows でこれを行うにはどうすればよいですか?
-rdynamic
便利なLinuxがあると聞きましたが、Windowsに関しては完全に途方に暮れています。
ポイントは、共有ライブラリに対してホストとプラグインの両方をリンクすることから離れて、静的に構築されたホストに移行することです。
linux - 共有ライブラリ内のライブラリ関数の選択的静的リンク
サードパーティの静的ライブラリの関数を使用する共有ライブラリを作成したいと考えています。たとえばfoo
、bar
からlibfoobar.a
. 私のメインアプリケーションもfoo
そのシンボルを使用しており、エクスポートすることを知っています。bar
したがって、リンクしてコードサイズを節約し、「foo」を未解決のままにしたいだけです(メインアプリケーションによって提供されるため)。を含めるlibfoobar.a
と、リンカーldは共有ライブラリに両方の関数を含めます。を含めないと、アプリケーション自体が にリンクしていないためlibfoobar.a
、ライブラリは関数にアクセスできません。質問:bar
bar
- 共有ライブラリを構築するときに特定のシンボルのみを解決するようにldに指示する方法はありますか?
- 共有
libfoobar.a
ライブラリに変わりますか? bar
から関数を含むファイルを抽出libfoobar.a
し、リンカー行でそれを指定しますか?- 心配する必要はありません。ランタイム ローダーは
bar
アプリケーションから使用するため、共有ライブラリ内の のコピーはbar
読み込まれませんか?
c++ - 異なるバージョンの C ランタイム ライブラリでビルドされたライブラリに対して静的にリンクしています。
次のシナリオを考えてみましょう: アプリケーションがサードパーティのライブラリ A にリンクしています。
A は MSVC 2008 を使用してビルドされ、C ランタイム ライブラリ v9.0 に静的にリンクされています (つまり、/MT でビルドされています)。
アプリケーションは MSVC 2005 を使用して構築され、A および (/MT を使用して) C ランタイム ライブラリ v8.0 に静的にリンクしています。
これには問題があります。たとえば、ランタイム ライブラリのバージョン間でヘッダーの型が変更された場合などです。
バージョン間でランタイム ライブラリ ヘッダーの互換性を維持するように注意していますか?それとも、静的にリンクされたすべてのライブラリが同じバージョンのランタイム ライブラリにリンクしていることを常に確認する必要がありますか?
static-linking - リンクされた実行可能ファイルに静的ライブラリ シンボルがありません
.a
静的に作成されたライブラリを別の C コードにリンクしようとしています。
ただし、最終的な実行可能ファイルでは、nm
コマンドで見ると、いくつかのシンボル (関数名) が欠落していることがわかります。これは、リンカー (gcc
呼び出されている) が、ライブラリにリンクされている他のC
コードで参照されていないシンボルを削除しているためです。nm
コマンドで見つけようとしている関数シンボルが.a
ライブラリに表示されます。
このように省略されたシンボルをリンカが取り除かないようにするにはどうすればよいですか?
c - Glade と静的リンク
FreeBSD 8 で GTK+ プログラムを静的にリンクするgtk_builder_add_from_file()
と、突然エラーが返されます。
それを修正する方法は?動的リンクを使用すると、すべてが正常に機能します。
更新:リンクは次の方法で行われます:
または言い換えると、Makefile には次のものがあります。