問題タブ [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 - gcc でソース コード ファイルを含むライブラリ アーカイブをコンパイルするにはどうすればよいですか?
TL;DR - 実行可能ファイルを作成するには、archive.a を test.o でコンパイルする必要があります。
背景 - 変更中のソフトウェア パッケージから別のライブラリの関数を呼び出そうとしていますが、関数 (文字列パーサー) がセグメンテーション違反を引き起こしています。エラーは間違いなくライブラリで発生しており、開発者はエラーが発生するテスト ケースを求めています。私が取り組んでいるかなり大きなソフトウェア パッケージを彼にコンパイルしてもらうよりも、適切な関数を呼び出す単純なプログラムを彼に送りたいと思います (うまくいけば、同じ場所で死にます)。彼のライブラリはいくつかのシステム ライブラリ (lapack、cblas など) も使用しているため、リンクは私が考えるすべてのものにヒットする必要があります。
彼のライブラリを作成したときに作成される .o ファイルにリンクすることはできますが、もちろん、適切なシステム ライブラリにはリンクしません。
これは簡単なことのように思えますが、私は完全に困惑しています。
c - 単一のヘッダー ファイルを使用して、複数のライブラリとオブジェクト ファイルで構成されるスタティック ライブラリへのリンク
私は非常に大規模で厄介なプロジェクトに取り組んでおり、実際にクリーンアップする時間がなく、そのための API を提供する任務を負っています。私がやろうとしているのは、すべての醜いものを単一の静的ライブラリにラップしてから、単一のヘッダー ファイルを提供することです。
しかし、ヘッダー ファイルとライブラリを使用して実行可能ファイルをビルドしようとすると、一連の「未定義の参照」エラーが発生します。すべてのヘッダー ファイルを提供すればうまくいくと思いますが、実際にはこれを行う必要はありません。
現在、次のようにmakefile
見えます (簡単にするために少し変更されています)。
アーカイブを確認したlibgiant_lib.a
ところ、必要なすべてのライブラリとオブジェクト ファイルが含まれているようです。それでも、それに対するリンクは機能しません。
ここで明らかな何かが欠けていると確信しています...
c - 静的ライブラリがシン アーカイブかどうかを検出する
静的ライブラリをシン アーカイブとしてリンクすると、.o ファイルはアーカイブにコピーされず、.a ファイルからの相対パスで参照されます。
特定の .a ファイルがシン アーカイブであるかどうかを確認するにはどうすればよいですか?
c - コードの何が問題になっていますか? (アーカイブファイル内のファイル名の出力)
Unixからアーカイブファイルを開き、ファイルを読み取り、アーカイブ内のファイルとファイル名だけを出力するプログラムを作成しようとしています。以下は私のコードです - それはコンパイルされますが、ターミナルで奇妙な出力が得られました - 例えば ?;?U?. 2つのtxtファイル名が表示されるだけです。誰かが私のコードを見て、何が欠けているかについてのガイダンスを教えてもらえますか? ありがとうございました!
編集: コードにいくつかの変更を加えましたが、まだ機能していません。どんな提案や助けも大歓迎です。
c++ - ar はアーカイブを作成できません:「ファイル形式が認識されません」
私はこのメイクファイルを持っています
どういうわけか(私のLinuxボックスで)、私は得る
ar --help が与える
ファイルjackport.o
c - gcc が静的ライブラリで未解決のシンボルをリンクする順序は何ですか?
関数シンボルの競合の問題をデバッグすると、理解できない gcc の奇妙な動作が見つかりました。次のサンプル コードで説明します。
main.c
交流
紀元前
コンパイル:
実行する:
私の質問は:
a
関数内でmain
関数をa in b.c
呼び出すのはなぜa in a.c
ですか?- ライブラリの順序を変更した後:
gcc main.c libb.a liba.a
、結果は同じです。なんで? - この状況でリンカーがシンボルの競合を報告しないのはなぜですか?
c++ - C++ マージされたスタティック ライブラリを使用すると、未定義の参照エラーが発生する
アプリケーションで libA.a が必要だとします。libA.a には libB.a 自体が必要であり、アプリケーションで両方に静的にリンクする必要があります。これを解消するために、これら 2 つ (libA.a と libB.a) をマージして libAB.a を作成します (これは ar ツールを使用して行います)。まだ問題はありません。
アプリケーション (libAB.a にリンクされている) を実行したい場合、コンパイラは、libB を使用している libA 内のメソッドへの未定義の参照について不平を言い始めます! アプリを libAB.a に加えて libBa.a にリンクすると、すべて問題ありません。ファイル サイズによると、libAB.a は libA と libB のマージの結果のようですが、コンパイル時には libA のみがアプリケーションで使用できるようです。
マージコマンドは次のとおりです。
Foundation.txt には、.a ファイルを作成する .o ファイルのリストが含まれています。そして、これが私のアプリケーションのコンパイルコマンドです:
c++ - 動的ライブラリに自動的にリンクする静的ライブラリを作成するにはどうすればよいですか?
私は社内のインフラストラクチャ ライブラリを管理しています - と呼びましょうlibcluracan
。このライブラリは、コードが使用される外部のコンピューターには存在しないため、静的にリンクする必要があります。
これはlibcluracan.so
、リンカーを使用してファイルを作成する代わりに、コマンドlibcluracan.a
を使用してファイルを作成することを意味しますar
現在、いくつかの新しい機能を に追加しようとしてlibcluracan
いますが、外部ライブラリとのリンクが必要-lfltk
です。具体的には ですが、詳細は重要ではありません。重要なのは、外部のコンピューターにこのライブラリ (および必要な他の公開ライブラリ) があると想定できることです。
最大の問題は、社内のプログラマーがコードをコンパイル (リンク) する方法を変更できないことです。
動的libcluracan.so
ライブラリを使用していた場合は、リンカに追加-lfltk
するだけで忘れてしまいます。プログラマは引き続きリンクして自動的-lcluracan
に取得し-lfltk
ます。
libcluracan.a
静的ライブラリで同じことを行う方法を見つける必要があります。
TL;DR
.a
使用時に別の動的ライブラリに自動的にリンクする静的ライブラリを作成する方法はあり.so
ますか?