gcc
Gnu / Linuxを実行している組み込みarmでCファイルをコンパイルしたいと思います。
どの関数/ヘッダーファイルを静的にコンパイルする必要があるのか、どの関数/ヘッダーファイルを動的にコンパイルする必要があるのか、どうすればわかりますか? (すべてのヘッダファイルを静的にコンパイルしたくない)
使用できるコマンドはありますか?
たとえば、stdio.h
を使用するために含めましたがprintf
、静的にコンパイルする必要があるかどうかを知る方法がありますか?
答え1
ターゲットシステムで利用可能な動的ライブラリとそうでない動的ライブラリを知る必要があります。
たとえば、私のシステムでは、stdio.h
このライブラリはパッケージ内のインクルードファイルの1つlibc6-dev
(Debianパッケージの命名規則)であり、その動的ライブラリlibc.so.6
はですlibc-2.24.so
。これはほとんどすべてのプログラムの基本的なビルディングブロックなので、ARM用です。 systemつまり、このライブラリ(またはそれと同等のものの一部)を動的ライブラリとして使用しないことは非常にまれです。一般的に使用され、かなり大きいので、動的ライブラリとして使用するのは完璧です。
(また、GNU Cライブラリ自体は設定可能な名前解決機能などの操作に動的接続を使用します。/etc/nsswitch.conf
これはCライブラリにlibnss_*.so
実行時にロードするライブラリを通知するため、GNU Cライブラリをプログラムに完全に静的にリンクするのは非常に難しいかもしれません。あります。)
特定のライブラリーの特定のファイルが組み込みARMシステムにインストールされていないため、lib*.so
プログラムでそのライブラリーを引き続き使用するには、ライブラリーを静的にリンクする必要があります。クロスコンパイルの場合、これを行うには対応する項目が必要です。ARMバージョンlib*.a
図書館のファイルプログラムをクロスコンパイルするシステムで。
ライブラリのヘッダファイル(*.h
)は、ライブラリがコンパイル可能なすべてのアーキテクチャで同じである可能性が高いですが、*.so
ファイル*.a
はそうではありません。*.so
そして*.a
ファイルはすべて実行可能なコードを含んでいるので、各プロセッサアーキテクチャによって異なります。したがって、x86_64システムがARM用にクロスコンパイルする場合、使用可能な特定のライブラリファイルのx86_64バージョンでは、静的にコンパイルされたライブラリを使用してARMプログラムをクロスコンパイルすることはできません。そのライブラリにはARMがlib*.a
必要です。lib*.a