技術ノート Linux Linux の ar コマンドを使用して静的ライブラリを作成する方法

Linux の ar コマンドを使用して静的ライブラリを作成する方法

ソフトウェア開発時に関数ライブラリを作成するには、Linux の ar コマンドを使用します。このチュートリアルでは、静的ライブラリを作成し、変更し、プログラムで使用する方法をサンプル コードとともに示します。

ar コマンドは、1971 年から存在する非常にベテランのコマンドです。ar ar 名前は、このツールの本来の使用目的である アーカイブ ファイルの作成に 由来しています。アーカイブ ファイルは、他のファイルのコンテナとして機能する単一のファイルです。他の多くのファイルの場合もあります。ファイルはアーカイブに追加、削除、またはアーカイブから抽出できます。この種の機能を探している人は、もはや ar を利用しません。その役割は、次のような他の電力会社に引き継がれています。

 tar

ただし、 ar コマンドは依然としていくつかの専門的な目的で使用されています。 ar は静的ライブラリを作成するために使用されます。これらはソフトウェア開発で使用されます。また、 ar は、Debian Linux ディストリビューションやその派生版 (Ubuntu など) で使用される「.deb」ファイルなどのパッケージ ファイルを作成するためにも使用されます。

静的ライブラリの作成と変更に必要な手順を実行し、プログラムでライブラリを使用する方法を示します。そのためには、静的ライブラリが満たすべき要件が必要です。このライブラリの目的は、テキスト文字列をエンコードし、エンコードされたテキストをデコードすることです。

これはデモンストレーションを目的とした簡単で汚いハックであることに注意してください。この暗号化を価値のあるものには使用しないでください。これは世界で最も単純な 換字暗号 であり、A は B になり、B は C になります。

cipher_encode() 関数と cipher_decode() 関数

「library」というディレクトリで作業し、後で「test」というサブディレクトリを作成します。

このディレクトリには 2 つのファイルがあります。 cipher_encode.c というテキスト ファイルには、 cipher_encode() 関数があります。

 void cipher_encode(char *text)

{

for (int i=0; text[i] != 0x0; i++) {

テキスト[i]++;

}

} // cipher_encodeの終わり

対応する cipher_decode() 関数は、cipher_decode.c というテキスト ファイル内にあります。

 void cipher_decode(char *text)

{

for (int i=0; text[i] != 0x0; i++) {

テキスト[i]–;

}

} // cipher_decodeの終わり

プログラミング命令を含むファイルはソース コード ファイルと呼ばれます。 libcipher.a というライブラリ ファイルを作成します。これには、これら 2 つのソース コード ファイルのコンパイルされたバージョンが含まれます。 libcipher.h という短いテキスト ファイルも作成します。これは、新しいライブラリの 2 つの関数の定義を含むヘッダー ファイルです。

ライブラリとヘッダー ファイルを持っている人は誰でも、独自のプログラムで 2 つの関数を使用できます。車輪を再発明して関数を書き直す必要はありません。彼らは単に私たちの図書館にあるコピーを利用するだけです。

Linux の ar コマンドを使用して静的ライブラリを作成する方法

cipher_encode.c および cipher_decode.c ファイルのコンパイル

ソース コード ファイルをコンパイルするには、 標準の GNU コンパイラである gcc を使用します。 -c (コンパイル、リンクなし) オプションは、 gcc ファイルをコンパイルしてから停止するように指示します。各ソース コード ファイルからオブジェクト ファイルと呼ばれる中間ファイルを生成します。 gcc リンカーは通常、すべてのオブジェクト ファイルを取得し、それらをリンクして実行可能プログラムを作成します。 -c オプションを使用することで、そのステップをスキップします。必要なのはオブジェクト ファイルだけです。

必要なファイルがあるかどうかを確認してみましょう。

 ls -l

2 つのソース コード ファイルがこのディレクトリに存在します。 gcc を使用してオブジェクト ファイルにコンパイルしましょう。

 gcc -c cipher_encode.c

 gcc -c cipher_decode.c

すべてがうまくいけば、 gcc からの出力はないはずです。

これにより、ソース コード ファイルと同じ名前で拡張子が「.o」の 2 つのオブジェクト ファイルが生成されます。これらはライブラリ ファイルに追加する必要があるファイルです。

 ls -l 

Linux の ar コマンドを使用して静的ライブラリを作成する方法

libcipher.a ライブラリの作成

ライブラリ ファイル (実際にはアーカイブ ファイル) を作成するには、 ar を使用します。

-c (作成) オプションを使用してライブラリ ファイルを作成し、 -r (置換付き追加) オプションを使用してファイルをライブラリ ファイルに追加し、 -s (インデックス) オプションを使用して内部のファイルのインデックスを作成します。ライブラリファイル。

ライブラリ ファイルを libcipher.a という名前にします。ライブラリに追加するオブジェクト ファイルの名前とともに、コマンド ラインでその名前を指定します。

 ar -crs libcipher.a cipher_encode.o cipher_decode.o

ディレクトリ内のファイルをリストすると、libcipher.a ファイルがあることがわかります。

ls -l

ar -t (テーブル) オプションを使用すると、ライブラリ ファイル内のモジュールを確認できます。

 ar -t libcipher.a 

Linux の ar コマンドを使用して静的ライブラリを作成する方法

libcipher.h ヘッダー ファイルの作成

libcipher.h ファイルは、libcipher.a ライブラリを使用するすべてのプログラムに組み込まれます。 libcipher.h ファイルには、ライブラリ内の関数の定義が含まれている必要があります。

ヘッダー ファイルを作成するには、 gedit などのテキスト エディター に関数定義を入力する必要があります。ファイルに「libcipher.h」という名前を付け、libcipher.a ファイルと同じディレクトリに保存します。

 void cipher_encode(char *text);

void cipher_decode(char *text);

Linux の ar コマンドを使用して静的ライブラリを作成する方法

libcipher ライブラリの使用

新しいライブラリをテストする唯一の確実な方法は、それを使用するための小さなプログラムを作成することです。まず、test というディレクトリを作成します。

 mkdir テスト

ライブラリとヘッダー ファイルを新しいディレクトリにコピーします。

 cp libcipher.* ./test

新しいディレクトリに移動します。

 CDテスト

2 つのファイルがここにあることを確認してみましょう。

 ls -l

ライブラリを使用できる小さなプログラムを作成し、それが期待どおりに機能することを証明する必要があります。次のテキスト行をエディタに入力します。エディターの内容を test ディレクトリ内の「test.c」という名前のファイルに保存します。

 #include <stdio.h>

#include <stdlib.h>

#include “libcipher.h”

int main(int argc, char *argv[])

{

char text[]=”ハウツーオタクは Linux が大好き”;

put(テキスト);

cipher_encode(テキスト);

put(テキスト);

cipher_decode(テキスト);

put(テキスト);

出口(0);

} // メインの終わり

プログラムの流れは非常にシンプルです。

  • これには、ライブラリ関数の定義を確認できるように libcipher.h ファイルが含まれています。
  • 「text」という文字列を作成し、その中に「How-To Geekloves Linux」という単語を保存します。
  • その文字列を画面に出力します。
  • cipher_encode() 関数を呼び出して文字列をエンコードし、エンコードされた文字列を画面に出力します。
  • cipher_decode() を呼び出して文字列をデコードし、デコードされた文字列を画面に表示します。

test プログラムを生成するには、test.c プログラムをコンパイルし、ライブラリにリンクする必要があります。 -o (出力) オプションは、gcc が生成する実行可能プログラムの呼び出し先を gcc 指示します。

 gcc test.c libcipher.a -o テスト

gcc 黙ってコマンド プロンプトに戻れば、すべて問題ありません。それでは、プログラムをテストしてみましょう。真実の瞬間:

 。/テスト

そして、期待される出力が表示されます。 test プログラムは、プレーン テキストを出力し、暗号化されたテキストを出力し、次に復号化されたテキストを出力します。新しいライブラリ内の関数を使用しています。私たちの図書館は稼働しています。

成功。しかし、なぜそこで止まるのでしょうか?

Linux の ar コマンドを使用して静的ライブラリを作成する方法

ライブラリに別のモジュールを追加する

ライブラリに別の関数を追加してみましょう。プログラマが使用しているライブラリのバージョンを表示するために使用できる関数を追加します。新しい関数を作成してコンパイルし、新しいオブジェクト ファイルを既存のライブラリ ファイルに追加する必要があります。

エディターに次の行を入力します。エディターの内容をライブラリ ディレクトリ内の cipher_version.c という名前のファイルに保存します。

 #include <stdio.h>

void cipher_version(void)

{

put(“How-To Geek :: 非常に安全でない暗号ライブラリ”);

put(“バージョン 0.0.1 アルファ版\n”);

} // cipher_version の終わり

新しい関数の定義を libcipher.h ヘッダー ファイルに追加する必要があります。そのファイルの最後に次のように新しい行を追加します。

 void cipher_encode(char *text);

void cipher_decode(char *text);

void cipher_version(void);

変更した libcipher.h ファイルを保存します。

cipher_version.o オブジェクト ファイルを作成するには、cipher_version.c ファイルをコンパイルする必要があります。

 gcc -c 暗号バージョン.c

これにより、cipher_version.o ファイルが作成されます。次のコマンドを使用して、新しいオブジェクト ファイルを libcipher.a ライブラリに追加できます。 -v (冗長) オプションを使用すると、通常は沈黙する ar が何をしたかを知らせるようになります。

 ar -rsv libcipher.a cipher_version.o

新しいオブジェクト ファイルがライブラリ ファイルに追加されます。 ar 確認を出力します。 「a」は「追加」を意味します。

-t (テーブル) オプションを使用すると、ライブラリ ファイル内にどのようなモジュールがあるかを確認できます。

 ar -t libcipher.a

ライブラリ ファイル内には 3 つのモジュールが含まれています。新しい機能を使ってみましょう。

Linux の ar コマンドを使用して静的ライブラリを作成する方法

cipher_version() 関数の使用。

古いライブラリとヘッダー ファイルをテスト ディレクトリから削除し、新しいファイルをコピーして、テスト ディレクトリに戻します。

古いバージョンのファイルは削除します。

 rm ./test/libcipher.*

新しいバージョンを test ディレクトリにコピーします。

 cp libcipher.* ./test

test ディレクトリに移動します。

 CDテスト

そして、新しいライブラリ関数を使用するように test.c プログラムを変更できるようになりました。

test.c プログラムに、 cipher_version() 関数を呼び出す新しい行を追加する必要があります。これを最初の puts(text); ライン。

 #include <stdio.h>

#include <stdlib.h>

#include “libcipher.h”

int main(int argc, char *argv[])

{

char text[]=”ハウツーオタクは Linux が大好き”;

// ここに新しい行が追加されました

cipher_version();

put(テキスト);

cipher_encode(テキスト);

put(テキスト);

cipher_decode(テキスト);

put(テキスト);

出口(0);

} // メインの終わり

これを test.c として保存します。これをコンパイルして、新しい関数が動作するかどうかをテストできます。

 gcc test.c libcipher.a -o テスト

新しいバージョンの test を実行してみましょう。

新しい機能が動作しています。ライブラリのバージョンは、 test からの出力の先頭で確認できます。

しかし、問題があるかもしれません。

ライブラリ内のモジュールの交換

これはライブラリの最初のバージョンではありません。 2番目です。バージョン番号が間違っています。最初のバージョンには cipher_version() 関数がありませんでした。これはそうです。したがって、これはバージョン「0.0.2」である必要があります。ライブラリ内の cipher_version() 関数を修正された関数に置き換える必要があります。

ありがたいことに、 ar 使用すると、それが非常に簡単になります。

まず、ライブラリ ディレクトリ内の cipher_version.c ファイルを編集しましょう。 「バージョン 0.0.1 アルファ」のテキストを「バージョン 0.0.2 アルファ」に変更します。次のようになります。

 #include <stdio.h>

void cipher_version(void)

{

put(“How-To Geek :: 非常に安全ではない暗号ライブラリ”);

put(“バージョン 0.0.2 アルファ版\n”);

} // cipher_version の終わり

このファイルを保存します。新しい cipher_version.o オブジェクト ファイルを作成するには、これを再度コンパイルする必要があります。

 gcc -c 暗号バージョン.c

ここで、ライブラリ内の既存の cipher_version.o オブジェクトを新しくコンパイルしたバージョンに置き換えます。

新しいモジュールをライブラリに追加するために、以前に -r (置換付き追加) オプションを使用しました。ライブラリにすでに存在するモジュールでそれを使用すると、 ar 古いバージョンを新しいバージョンに置き換えます。 -s (インデックス) オプションはライブラリのインデックスを更新し、 -v (詳細) オプションは ar に何を行ったかを知らせます。

 ar -rsv libcipher.a cipher_version.o

今回 ar 、cipher_version.o モジュールを置き換えたことを報告します。 「r」は置き換えという意味です。

更新された cipher_version() 関数の使用

変更したライブラリを使用して、それが機能することを確認する必要があります。

ライブラリ ファイルを test ディレクトリにコピーします。

 cp libcipher.* ./test

test ディレクトリに移動します。

 cd ./テスト

新しいライブラリを使用してテスト プログラムを再度コンパイルする必要があります。

 gcc test.c libcipher.a -o テスト

これで、プログラムをテストできるようになりました。

 。/テスト

テスト プログラムからの出力は予想どおりでした。正しいバージョン番号がバージョン文字列に表示されており、暗号化ルーチンと復号化ルーチンが機能しています。

ライブラリからのモジュールの削除

せっかくなので、ライブラリファイルからcipher_version.oファイルを削除しましょう。

これを行うには、 -d (削除) オプションを使用します。 -v (冗長) オプションも使用して、 ar 何を行ったかを知らせます。ライブラリ ファイル内のインデックスを更新するための -s (インデックス) オプションも含めます。

 ar -dsv libcipher.a cipher_version.o

ar 、モジュールが削除されたことを報告します。 「d」は「削除」を意味します。

ar ライブラリ ファイル内のモジュールをリストするように依頼すると、2 つのモジュールに戻っていることがわかります。

 ar -t libcipher.a

ライブラリからモジュールを削除する場合は、必ずライブラリ ヘッダー ファイルからモジュールの定義を削除してください。

コードを共有する

ライブラリを使用すると、実用的かつプライベートな方法でコードを共有できるようになります。ライブラリ ファイルとヘッダー ファイルを提供した人は誰でもライブラリを使用できますが、実際のソース コードは非公開のままです。

Linuxコマンド

ファイル

tar pv cat tac chmod grep diff sed ar man pushd popd fsck testdisk seq fd pandoc cd $PATH awk join jq fold uniq journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc · tr

プロセス

エイリアス · スクリーン · トップ · ナイス · renice · 進行状況 · strace · systemd · tmux · chsh · 履歴 · at · バッチ · フリー · what · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · タイムアウト · ウォール · はい · キル · スリープ · sudo · su · タイム · groupadd · usermod · · lshw · シャットダウン · 再起動 · 停止 · パワーオフ · パスワード · lscpu · crontab · 日付 · bg · fg · pidof · nohup · pmap

ネットワーキング

netstat ping ip ss whois fail2ban bmon dig finger nmap ftp curl wget who whoami w iptables ssh-keygen ufw arping firewalld

関連: 開発者と愛好家のための最高の Linux ラップトップ

「Linux の ar コマンドを使用して静的ライブラリを作成する方法」に関するベスト動画選定!

私はLinuxのコマンドをどうやって覚えたのか?!
【とりあえず覚えておけば大丈夫】Linuxコマンド10選についてお話します