autoconfを使用してMakefileを生成し、プロジェクトをコンパイルする手順

autoconfを使用してMakefileを生成し、プロジェクトをコンパイルする手順

序文

Linux では、コンパイルとリンクには Makefile を使用する必要がありますが、適切な Makefile を書くのは簡単ではなく、標準の Makefile を書くのはさらに面倒です。 autoconf を使用して Makefile を生成すると、特に大規模なプロジェクトでは多くのトラブルを回避できます。

ここでは、プロジェクトを使用してその方法を説明します。一部の手順は必須ではありませんが、どの手順が必須でないかわからない場合は、一部の手順が省略されており、それに応じてコードも変更する必要があるため (パスの変更など)、手順を 1 つ 1 つ実行することをお勧めします。

ステップ

まずautoconfをインストールする

sudo apt-get install autoconf

新しいプロジェクトフォルダを作成します(例:joy)

mkdir joy

cd joy

プロジェクトのライブラリ ファイルとソース ファイルを保存するために、 lib と src という 2 つの新しいフォルダーを作成します。

mkdir lib

mkdir src

次の図に示すように:

lib フォルダに入り、haha.h などの新しいヘッダー ファイルを作成し、ランダムに関数を宣言します。

cd lib

gedit haha.h

//ははは.h
#include <stdio.h>
void printhaha();

src フォルダーに入り、haha.c などの新しい C ファイルを作成してヘッダー ファイルの関数を実装し、main_code.c などの新しい C ファイルを作成してメイン関数を記述します。

cd ../src

gedit haha.c

//ははは.c
#include "../lib/haha.h"
void printhaha()
{
  printf("はは\n");
}
//メインコード.c
#include "../lib/haha.h"
void main()
{
  printhaha();
}

Joyフォルダに戻ると、プロジェクトファイルが書き込まれています

cd ..

autoscan を実行して configure.scan を生成します

autoscan

configure.scanを編集する

gedit configure.scan

編集前のファイルは次のようになります

#元のファイルを編集する# -*- Autoconf -*-
# このファイルを autoconf で処理して configure スクリプトを生成します。
AC_PREREQ([2.69])
AC_INIT([フルパッケージ名], [バージョン], [バグレポートアドレス])
AC_CONFIG_SRCDIR([src/haha.c])
AC_CONFIG_HEADERS([config.h])
# プログラムをチェックします。
AC_PROG_CC
# ライブラリをチェックします。
# ヘッダーファイルをチェックします。
# typedef、構造体、およびコンパイラの特性をチェックします。
# ライブラリ関数をチェックします。
AC_出力

接頭辞ACはAutoConfを意味します
AC_PREREQについては心配しないでください
AC_INITに[パッケージ名] [バージョン] [バグ報告アドレス(あなたのメールアドレス)]を入力してください
AC_CONFIG_SRCDIR のソース ファイル パスの下に任意のファイル名を入力します。Autoconf は、ファイルが存在するかどうかをチェックして、パスが正しいかどうかを判断します。通常は、心配する必要はありません。
AC_CONFIG_HEADERS に次の文を挿入しても問題ありません。これは automake 段階で必須であり、そうでない場合はエラーが報告されます。
AM_INIT_AUTOMAKE
AMはAutoMakeの略です
最後のAC_OUTPUTがAC_OUTPUTに変更される(Makefile)
変更されたファイルは次のようになります。

#変更されたファイル# -*- Autoconf -*-
# このファイルを autoconf で処理して configure スクリプトを生成します。
AC_PREREQ([2.69])
AC_INIT(hhh, 1.0, [email protected])
AC_CONFIG_SRCDIR([src/haha.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE  
# プログラムをチェックします。
AC_PROG_CC
# ライブラリをチェックします。
# ヘッダーファイルをチェックします。
# typedef、構造体、およびコンパイラの特性をチェックします。
# ライブラリ関数をチェックします。
AC_OUTPUT(メイクファイル)

保存して、configure.scan の名前を configure.ac に変更します。

新しいMakefile.amを作成する

gedit Makefile.am

次のコードを入力してください

AUTOMAKE_OPTIONS=\ オートメイクオプション
  外国 \
  サブディレクトリオブジェクト
bin_PROGRAMS=テスト_prj 
test_prj_SOURCES=\
  lib/haha.h \
  src/haha.c \
  src/メインコード.c

AUTOMAKE_OPTIONS の後には、スペースで区切られた automake 実行オプションが続きます。
外部は必要なファイルのみが検出されることを意味します。
subdir-objects は、コンパイルされた .o ファイルをサブパスに (ソース ファイルと一緒に) 配置できることを意味します。このオプションを指定しないと、すべての .o ファイルはプロジェクトのルート ディレクトリに配置されます。
bin_PROGRAMS の後の名前は、生成された実行可能バイナリ ファイルの名前です。bin_PROGRAMS は複数存在できますが、各 bin_PROGRAMS には対応する xxx_SOURCES が必要です。
xxx_SOURCES は、ヘッダー ファイル、ソース ファイルなどを含む実行可能ファイル xxx の依存関係です。

aclocal を使用して aclocal.m4 ファイルを生成する

aclocal

autoconfでconfigureファイルを生成する

autoconf

自動ヘッダー付きのconfig.h.inを生成する

autoheader

automakeでMakefile.inを生成するには、--add-missingを追加してデフォルトのファイルを自動的に追加する必要があります。

automake --add-missing

これでソフト​​ウェアの準備が整い、パッケージ全体を github またはオープンソース フォーラムにアップロードできるようになります。

他のユーザーは、ソース コード パッケージをダウンロードした後、実行可能ファイルをどのようにコンパイルおよびリンクするのでしょうか?あるいは、実行可能ファイルをどのようにコンパイルしてリンクするのでしょうか?

以下はソースコードのインストールの一般的な手順であり、コンパイルとリンクの手順でもあります。

まずMakefileを生成する

./configure

そして

make

実行ファイルtest_prjが生成されたことがわかります。

実行すると、結果は次のようになります。

結果は正しいです。

srcディレクトリに入ると、さらに2つのファイルが見つかりました


これは、AUTOMAKE_OPTIONS のサブディレクトリ オブジェクトの役割です。この文がなければ、2 つの .o ファイルがルート ディレクトリに表示されます。残念ながらプロジェクトが大きく、同じ名前のファイルが存在する場合は、深刻な結果を招く可能性があるため、この文を追加することをお勧めします。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • C++ 一般的なテンプレートを使用した Makefile の詳細な説明
  • Makefile/cmake/node-gyp で異なるプラットフォームを区別する方法
  • PythonはLinuxを操作するためにparamikoを使用する
  • 2つのLinuxサーバー間でファイルとフォルダを転送する手順
  • Linux で削除できないファイル/フォルダの解決方法
  • Linux で現在の Python インタープリターの場所を見つける方法
  • Linux シェル配列と連想配列の使用例
  • Linuxターミナルでシェルスクリプトを実行して現在実行中のアプリのログを直接出力するAndroidの実装方法
  • pyqt を使用して Linux コマンド プログラムをリモートでバッチ実行する方法
  • Linux シェル環境での Zabbix API の使用

<<:  CocosCreator ユニバーサルフレームワークデザインネットワーク

>>:  MySql はデータを正常に挿入しますが、[Err] 1055 エラーが報告されます。解決策

推薦する

VMware15 仮想マシン ブリッジ モードでインターネットにアクセスできない問題の解決方法

説明 ソリューションVMware 15 仮想マシン ブリッジ モードではインターネットにアクセスでき...

MySQLユーザー削除バグを解決する

著者が MySQL を使用してユーザーを追加していたところ、ユーザー名が間違って記述されていることに...

Dockerに関するよくある質問

Docker はポートを IPv6 にのみマッピングし、IPv4 にはマッピングしません。 dock...

MySQL ログインおよび終了コマンドの形式

mysql ログインのコマンド形式は次のとおりです。 mysql -h [hostip] -u [ユ...

macOS での MySQL 8.0.17 のインストールと簡単な設定チュートリアル

私が書いた内容が理解できない場合は、インターネット上に理解できるチュートリアルがない可能性があります...

Linux の fsevents モジュールによって発生する npm ls エラーの解決方法の詳細な説明

Mac で開発されたプロジェクトがあり、パッケージ npm i がインストールされており、すべて正常...

Node.js でのブレークポイント再開の実装

序文通常のビジネスニーズ: 写真、Excel などをアップロードします。結局のところ、数 MB のサ...

スキニングを実現するネイティブJavaScript

ネイティブJavaScriptでスキニングを実装するための具体的なコードは参考までに。具体的な内容は...

MySQL の一般的な問題とアプリケーション スキルの概要

序文MySQL の日常的な開発やメンテナンスでは、パスワードの紛失やテーブルの破損など、避けられない...

Navicatを使用してクラウドサーバーデータベースにリモート接続する方法

秘密鍵を開かずにリモート サーバーのデータベースに接続するのは非常に便利です。新しい接続でデータを入...

Nginxサービス500:内部サーバーエラーの原因の1つ

500 (内部サーバー エラー) サーバーでエラーが発生したため、要求を完了できませんでした。 50...

CSS3を使用してボタンホバーフラッシュダイナミック特殊効果コードを実装する

CSS3 の列シリーズ属性を使用してウォーターフォールレイアウトを作成する方法を紹介しました。興味の...

将来的に人気のあるウェブサイトのナビゲーションの方向

<br />今は情報爆発の時代であるだけでなく、サービス爆発の時代でもあります。それはす...

HTMLテーブルの詳細な説明

機能: データ表示、テーブルアプリケーションシナリオ。 <table> テーブル<...

Apache での ab パフォーマンス テスト結果を分析する

私はパフォーマンス テストを行うために常に Loadrunner を使用してきました。 Loadru...