注:開発ボードがかかるIMX6ULL PRO開発ボードを例として!!!
テキスト
1つは、hello.cをクロスコンパイルすることです。
1.準備:
ボード上で実行するか、NFSをインストールして使用する方が便利です。
ツールチェーンを解凍し、PATH環境変数を設定して、コンパイラ名を決定します。その後、コンパイルできます。
2. gccコンパイラは、Ubuntuを遠くまで移動するプログラムのコンパイルにのみ適しています。
3.異なるamボード上のコンパイラの名前が異なり、ツールチェーンの場所も異なります。異なるバージョンのコンパイラのプレフィックスが異なります(xxx-gccなど)。クロスコンパイルディレクトリ。
4.ネットワーク設定ガイドを参照してください。
5.gccコンパイラのヘッダーファイルのデフォルトパスは/ usr / includeであり、armコンパイラのヘッダーファイルはクロスコンパイラディレクトリの下のincludeディレクトリにあります。
6.ヘッダーファイルのコンパイル方法を指定します
。①#include "Header file":二重引用符を使用してヘッダーファイルを宣言し、ヘッダーファイルが現在のディレクトリで検索されることを示します
。②それでも<>を使用してヘッダーファイルを宣言します。ヘッダーファイルをデフォルトの検索パスに追加します。
または③引き続き<>を使用してヘッダーファイルを宣言し、コンパイルコマンドの最後に「-I [ヘッダーレコード]」を追加します。
7.関数ライブラリの場所:
gccコンパイラのライブラリは/ libと/ usr / libにあります。
クロスエディターでのライブラリのデフォルトパス:Jiaoyoubianzeのディレクトリに入り、find -namelibを実行してxxx / libとxxx / usr / libを取得します。一般的に、これら2つのディレクトリが探しているパスです。
2、GCCコンパイラ
1. cファイルを実行可能プログラムにコンパイルするプロセス:
.cファイル→前処理:元のファイルにインクルードするヘッダーファイルを挿入し、マクロ定義を展開し、条件付きコンパイルコマンドに従って使用するコードを選択します。
→コンパイル:詳細言語はアセンブリ言語に変換されます。ツール:ccl、x86には独自のcc1コマンドがあり、ARMボードにも独自のcc1コマンドがあります。
→アセンブル:アセンブリコードを特定の形式のマシンコードに変換します。これは通常、LinuxシステムではELFオブジェクトファイル(OBJファイル)として表され、使用されるツールは次のとおりです。x86には独自のasコマンドがあり、ARMバージョンにも独自のasコマンドがあり、xxxx-as(arm-linux-asなど)の場合もあります。
→リンク:前の手順で生成したOBJファイルをシステムライブラリのOBJファイルとライブラリファイルにリンクし、最後に特定のプラットフォームで実行できる実行可能ファイルを生成します。使用するツールはldまたはcollect2です。
2. gccコンパイルプロセス:
(1)cclコマンドを使用して.cファイルを前処理およびコンパイルして、アセンブリコードを含む.sファイルを取得します。
(2)asコマンドを使用して.sファイルをアセンブルし、.oファイルを取得します。 、.oファイルにはマシンコードが含まれています
(3)collect2コマンドを使用して複数の.oファイルを他のライブラリファイルとリンクし、実行可能プログラム(APP)を取得し
ます
。3 。複数のファイルをコンパイルする方法:①コンパイルしてリンクします:gcc - o test main.c sub.c②個別の
コンパイルと統合リンク:
gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
gcc -o test main.o sub.o
注:
(1 )gcc -cコマンド:前処理を完了し、一度に3つのステップをコンパイルしてアセンブルし、.oファイルを取得します
。gcc-oコマンド:複数の.oファイルをリンクしてプログラムを取得することも、すべてを完了することもできます。一度に複数の.cファイルの場合4つのステップで手順を取得します(つまり、方法①)
(2)ファイル数が多い場合は方法②を使用します
理由:変更するファイルがある場合、すべてのファイルを再コンパイルするのに時間がかかります。変更されたファイルを再編集して新しい.oファイルを取得し、それらをリンクするだけです。
4. gccの一般的に使用されるオプション:
一般的なオプション |
説明 |
-E |
前処理、開発プロセス中に特定のマクロをすばやく決定したい場合は、「-E-dM」を使用できます |
-c |
前処理、コンパイル、およびアセンブリはすべて実行されますが、リンクは行われません。 |
- |
出力ファイルを指定します |
-私 |
ヘッダーファイルディレクトリを指定します |
-L |
リンク時にライブラリファイルのディレクトリを指定します |
-l |
リンクするライブラリファイルを指定します |
いくつかの非常に便利なパラメータ:
gcc -E main.c //どのヘッダーファイルであるかなどの前処理結果を表示します
gcc -E -dM main.c> 1.txt //すべてのマクロを展開し、1.txtに保存します(見やすくするため)
gcc -Wp、-MD、abc.dep -c -o main.o main.c //依存ファイルabc.depを生成し、後でMakefileが使用します
5.ダイナミックライブラリを作成して使用します。
(1)arch64 -linux -gnu-xxxなどのクロスコンパイラディレクトリでクロスコンパイルコマンドのプレフィックスを見つけます。
(2)コンパイル:
プレフィックス-gcc-c- omain.omain.cプレフィックス-gcc-c- osub.o sub.c
(3)ダイナミックライブラリを生成します。
プレフィックス-gcc-shared -o libsub.so sub.o(複数の.oファイルにすることができます)
(4)ダイナミックライブラリを使用します。:
プレフィックス-gcc-o test main.o -lsub-L [libsub.soが置かれているディレクトリ]
注:-shared:出力結果が共有ライブラリタイプであることを示します。-lパラメータ:ダイナミックライブラリの名前を指定します。-Lパラメータ:ライブラリのパスを指定します。
(5)プログラムテストを実行します。
このプログラムを実行するときは、ダイナミックライブラリを現在のシステムのライブラリのデフォルトパス(Ubuntuの場合は/ libや/ usr / lib
など)に配置するか、PATH変数を変更して、現在のダイナミックライブラリがあるディレクトリを追加する必要があります。位置しています:
エクスポートLD_LIBRARY_PATH = LD_LIBRARY_PATH:/ a
注:/ aは、ライブラリが配置されているパスです。6 。
静的ライブラリの作成と使用:
動的ライブラリとの違い:
(1)動的ライブラリの生成:ar crs libsub.a sub.o
(2)動的ライブラリの使用:prefix- gcc-o test main.o libsub.a
.aファイルが現在のディレクトリにない場合は、そのパスを指定する必要があります(-Lパラメーター)
(3)プログラムを実行します。静的ライブラリを配置する必要はありません。ボード。
7.ダイナミックライブラリと静的ライブラリ
(1)素人の言葉で言えば、プログラマが使用する対応する関数のインターフェイスを提供するために、一緒に使用される関数のオブジェクトファイルをパックすることです。
(2)サフィックス:
Windowsでは、.dllのサフィックスはダイナミックライブラリ、.libのサフィックスは
Linuxではスタティックライブラリ、.soのサフィックスはダイナミックライブラリ、.aのサフィックスはスタティックライブラリです。 。
(3)ライブラリの命名形式:lib + "library name" +
libsub.aなどのサフィックスはsubと呼ばれる
静的ライブラリです。(4)静的ライブラリ:たとえば、ライブラリファイルstdio.hは多くの後に形成されたファイルです。オブジェクトファイルは圧縮され、パッケージ化されます。
静的ライブラリの場合、リンク時にライブラリファイルを実行可能ファイルにリンクするだけで済み、プログラムの実行時にライブラリファイルは不要になります。
静的ライブラリのデメリット:
①メモリとディスク容量を占有する:ライブラリファイルを何回使用する必要があるか、対応するメモリが占有されます(n×ファイルサイズ)
②更新の問題:静的ライブラリを変更すると、ファイル全体が更新されます。
(5)ダイナミックライブラリ:
ダイナミックライブラリのコードは、プログラムの実行時にリンクされ、ライブラリのコードは複数のプログラムで共有されます。ダイナミックライブラリにリンクされた実行可能ファイルには、外部関数が配置されているオブジェクトファイルのマシンコード全体ではなく、ダイナミックライブラリで使用される関数エントリアドレスのテーブルのみが含まれています。
基本的な実現の考え方は、プログラムをモジュールに従って比較的独立した部分に分割し、プログラムの実行時にそれらをリンクして完全なプログラムを形成することです。
たとえば、プログラム1を実行しているとき、システムは最初にプログラム1をロードし、Lib.oファイルが必要であると判断すると、メモリにもロードしてから、プログラム2をロードします。 oファイルも必要です。Lib.oをリロードする必要はありません。プログラム2とLib.oファイルをリンクするだけで済みます。メモリには常にLib.oファイルが1つだけあります。
lddコマンドを使用して、実行可能ファイルが依存するダイナミックライブラリを表示できます。
利点:
①メモリを節約することは間違いありません;
②物理ページのスワップインとスワップアウトを
減らします; ③特定のモジュールをアップグレードする場合、理論的には対応する古いターゲットファイルのみを上書きする必要があります。ターゲットファイルの新しいバージョンが自動的にメモリにロードされ、リンクされます
。④プログラムの実行中に、さまざまなプログラムモジュールを動的にロードして、プログラムの拡張を実現できます。