問題タブ [unix-ar]
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++ - 同じ名前のオブジェクトファイルを持つ静的ライブラリ(ar)
ビットコンテキスト。ソースファイルがあり、静的ライブラリに保存する必要があるとします。2つのcppファイルがa.cpp
ありa.cpp
、2つの異なるサブディレクトリにあるとします。このようなもの:
それらの内容は衝突しておらず、完全に異なります。ファイル名はまったく同じです。
さて、コンパイルするとa.o
、もちろん2つのファイルになります。
今静的ライブラリを作成すると
を実行している静的ライブラリ内の両方のファイルを見ることができますnm libfoobar.a
。うまくいくようです。
問題
私が見ることができる問題は、ar
コマンドを個別に実行しfoo/a.o
、bar/a.o
それらを同じ静的ライブラリに配置するかどうかです。これで、後者のオブジェクトファイルが前者を上書きするため、実行するnm libfoobar.a
と、ライブラリに後者のオブジェクトが表示されます。同じオブジェクトファイル名が原因だと思います。
を使用して静的ライブラリを作成する場合、ar
常にすべてのオブジェクトを一度に組み合わせる必要がありますか、それともar
、オブジェクトの一部を一度に収集して複数回実行しても、すべて同じ静的ライブラリになりますか?この例では、前者の作品を見ることができますが、後者は見ることができません。
a.cpp
1つが変更され、静的ライブラリを変更する必要がある場合、どのように機能しますか?図書館で変更ar
する権利を見つけますか?a.cpp
これはほんの小さな例ですが、多くのファイルがあり、いくつかは同じ名前の大きなプロジェクトを考えてみてください。ここで単一のライブラリを作成したい場合は、このような状況になる可能性もあります。
一般に、これはライブラリの構成方法、ファイルの名前付け方法、または物事を機能させるためにこれに何か他のものがあるかについての不十分な編成ですか?
ant - Apache Ant を使用し、dpkg を使用せずに .deb を作成する
.deb インストール ファイルを作成するためのビルドファイルを作成しようとしています。
これまでのところ、とても順調です。私の目標は、dpkg を回避して、どのプラットフォームからでもビルドできるようにすることです。
すべての成果物 (control.tar.gz、data.tar.gz、debian-binary) を作成したので、これらのファイルを deb-File にパッケージ化する Ant-Task が必要です。
deb ファイルは単なる Ar(l) アーカイブですが、Ant でそのようなアーカイブを作成する方法がわかりませんでした。
「ArFileSet」をいくつか見つけたので、可能性はあると思いますが、このarFileSetをどこでどのように使用するのかわかりません。
gcc - 複数の静的ライブラリを 1 つの GCC scons にマージする
このライブラリ libmyproject.a を構築しています。他のいくつかの静的ライブラリ (libone.a および libtwo.a) を含めて、libmyproject とリンクするアプリケーションが libone および libtwo とリンクする必要がないようにします。
私はGCCチェーンが初めてです。Visual C++ では、すべての依存関係を追加するだけで、必要な他のすべてのライブラリも含むライブラリが作成されます。
GCC でこれを達成するにはどうすればよいですか?
おまけの質問: 私はビルドに scons を使用しています。これを行うように scons に指示する方法はありますか? 現在、私が提供するすべての追加ライブラリを無視し、.cpp ファイルのみをライブラリにコンパイルします。
c - `ar`ライブラリオーバーライドタイムスタンプ
.aアーカイブ形式のヘッダーにはタイムスタンプが必要です。これは、主に元のバイナリを正確に再現できないために、静的ライブラリを再構築するときに数え切れないほどの頭痛の種になりました。
たとえば(これは私のMacにありますが、x64 linuxでも同じことが起こります):
唯一の違いが時間であることを自分自身に証明するために、私はhexdumpに基づいて差分を取りました。
これは、ヘッダー形式を使用してバックソルブする場合、時間フィールドに対応します。
マンページには、ヘッダーのタイムスタンプを上書きできるかどうかは示されていません。何かご意見は?
編集:はい、任意のタイムスタンプを使用するために戻ってファイルを物理的にハッキングすることは可能です。はい、プログラムの動作を変更することは可能です。状況を取り巻く状況を考えると、そのすべてが本質的に厳密に技術的であるとは限らないため、タイムスタンプを手動で変更するツールは受け入れられず、の修正バージョンでar
も、実際のシステム時刻を台無しにすることもありません。
編集:この状況では、ビルドパスからの許容できない逸脱なしに、バイナリをソースから生成できることを証明する必要があります。一部の業界(金融など)では、これは明らかに標準的な方法です。タイムスタンプを変更するための手動ツールは使用できません(元のビルドパスになかった特別なツールが使用されたため)。のハンドロールバージョンar
は受け入れられません(同様の問題)。システムクロックを変更する際の問題は、ビルドを完全に調整する必要があることです(これは、多くのライブラリとバイナリを含む1時間のビルドです)。受け入れ可能なソリューションは次のとおりです。
- ライブラリ内のタイムスタンプを上書きする可能性のあるARまたはその他のプログラムへのフラグ
- これを行うための既存の(年齢> 1歳)ツール
- リンクを行うときにarからのタイムスタンプをオーバーライドできるGCCへのフラグ
linker - --start-group と --end-group を使用すると、スタティック ライブラリを作成するよりも高速にリンクできますか?
ビルド スクリプトで静的ライブラリをビルドし、それらの静的ライブラリを最終的な実行可能ファイルのリンクに使用したい場合、ファイルを指定する順序.a
が重要です。
gui.a
リンクで定義されたものを使用すると失敗します。これhw.a
は、その時点hw.a
で処理されるため、リンカーは後で定義が必要であることをまだ認識しておらず、それを being.generated 実行可能ファイルに含めないためです。リンカー行を手動でいじるのは実用的ではないため、解決策は--start-group
andを使用することです--end-group
。これにより、未定義のシンボルが見つからなくなるまで、リンカーがライブラリを 2 回実行します。
ただし、GNU ld マニュアルには次のように書かれています
このオプションを使用すると、パフォーマンスが大幅に低下します。2 つ以上のアーカイブ間で避けられない循環参照がある場合にのみ使用することをお勧めします。
したがって、すべてのファイルを取得して、ファイルをリンクする必要がある順序を示すインデックス ( GNU ar のオプション) を使用.a
して 1 つのファイルにまとめた方がよいのではないかと考えました。次に、その 1 つのファイルのみを に渡します。.a
-s
.a
g++
しかし、グループコマンドを使用するよりも速いか遅いかは疑問です。そして、そのアプローチに問題はありますか?また、これらの相互依存性の問題を解決するためのより良い方法はありますか?
編集:ファイルのリストを.a
取得してマージされたファイルを生成するプログラムを作成しました.a
。GNU 共通ar
フォーマットで動作します。LLVM のすべての静的ライブラリをまとめてパックすると、次のように機能します
すべてのファイルを手動で解凍し、インデックスを再計算して新しいファイル.a
に入れる場合と速度を比較しました。私のツールを使用すると、約 500 ミリ秒の一貫したランタイムが得られます。手動の方法を使用すると、時間は大きく異なり、約 2 秒かかります。だから価値があると思います。.a
ar
arcat
コードはこちらです。私はそれをパブリックドメインに入れました:)
android - arコマンドラインの長さ
bjamによってar(正確にはandroid ar)に非常に長いコマンドラインが指定されていますが、arはファイルパスを破損し、ファイルが存在しないと文句を言います。
arに大きなコマンドラインバッファを割り当てる方法はありますか?
gcc - Macos 10.6.8 (Snow Leopard) でのネイティブ ツールチェーンの問題
以下、問題の説明です。StackOverflow が行う暗黙の書式設定を避けるために、すべてをコードとしてマークしました。自分の質問をどのようにフォーマットしたいかを正確に知っているのに、Wiki のようなマークアップ言語を扱わなければならないのはかなり面倒です。
c++ - アーカイブ (.a) を使用したプログラムのコンパイルに関する問題
ライブラリ(.a)を使用してファイルをコンパイルしようとすると、 「致命的なエラー: URLInputStream.h: そのようなファイルまたはディレクトリのコンパイルは終了しませんでした。' . 私はまだC++にかなり慣れていないので、これはとても簡単に思えますが、うまく動作しません。
私が試したコンパイルコマンド:
アーカイブのコンパイル方法:
アーカイブは正しく構築されているようです:
でさまざまなオプションも試しましたar
。インクルード パスを指定する-I utils/inc
と、コンパイルして正常に動作するため、目的のファイルは正常に動作します。ここ StackOverflow に関する多数の記事や質問を読みましたが、自分が何を間違っているのかわかりません。 アイデアや提案はありますか?
注: 奇妙に思われるヘッダーをコンパイルしています。.cpp
元々はとに分割されて.h
いましたが、問題解決を簡単にするためにそれらをマージしました。それらが分割されたときにも、この同じエラーが発生しました。g++ src/Downloader.cpp -I inc -L lib -l cs240utils
linker - arは未定義の参照を導入します
静的ライブラリの使用方法を理解しようとしていますが、最も簡単な例は失敗します。
コンパイルfoo.c
とmain.c
動作:
アーカイブfoo.o
も文句を言いません:
しかし、リンクは次への未定義の参照で失敗しますfunc
:
両方とも私に:
gcc
リンクを経由して迂回すると、同様のエラーが発生します。
ください:
私はここで何が間違っているのですか?私が読んだ/使用したすべてのマニュアルと検索エンジンによると、これは静的ライブラリを使用する方法です。
gcc foo.o main.o
編集:完全にうまく機能する心。
c++ - Mac Lionは、「ar」、「nosymbols」を使用してライブラリを作成できません
IO.hとIO.cppにC++ソースコードがあり、静的ライブラリlibvcf.aを作成したいと思います。次に、次のコマンドを使用します。
問題ない。
だが、
私は現在MacOSXLionを使用しており、以下のg++versioを使用しています。
Linuxでは同じコマンドを使用できるようですが、Macでは使用できません。私もググって、運がなかった。ここに何か提案はありますか?ありがとう。