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 エラーが報告されます。解決策

推薦する

MySQL 入門 - 概念

1. それは何ですか? MySQL は最も人気のあるリレーショナル データベース管理システムです。W...

MySQLデータをOracleに移行する正しい方法

mysql データベースには student テーブルがあり、その構造は次のとおりです。 Oracl...

JavaScript スコープチェーンの基本原理のグラフィカルな説明

目次序文範囲1. スコープとは何ですか? 2. [[スコープ]] プロパティ3. スコープチェーン4...

jsは水平および垂直スライダーを実現します

最近、練習プロジェクトをしていたときにスライダーを使う必要があったので、調べてみました。まず、水平ス...

Dockerを使用してSpringBootプロジェクトをデプロイする方法

Docker テクノロジの開発により、マイクロサービスの実装にさらに便利な環境が提供されます。Doc...

HTML の左右レイアウトのサンプルコード

CS: ...コードをコピーコードは次のとおりです。 html,body{ margin:0px; ...

MySQL インストール プロンプト「詳細なヘルプについては NET HELPMSG 3534 と入力してください」の解決方法

今日、MySQL をインストールすると次のエラー メッセージが表示されます。 かなり長い時間ネットで...

MySQL 5.7.17 winx64 のインストールと設定のグラフィックチュートリアル

MySQL のインストールに関する以前のメモを要約して、皆さんと共有しました。ステップ 1: mys...

モバイルデバイス上のぼやけた小さなアイコンの問題を解決する方法

序文以前、画像とテキストの垂直方向のずれの問題について説明しました。ここで示した小さな例では、小さな...

Linux で yum と入力した後に -bash: /usr/bin/yum: No such file or directory という問題を解決する方法

Linuxでyumを入力すると、プロンプトが表示されます: -bash: /usr/bin/yum:...

WeChatミニプログラムはどのようにしてユーザー情報とユーザーの電話番号を同時に取得するのか

今日ログインページを書いていたとき、個人情報と携帯電話番号を認証する必要がありましたが、ページにボタ...

XHTML と CSS によるオブジェクト指向プログラミング

<br />XHTML と CSS がオブジェクト指向だったらよかったのに。 。太陽は北...

Vue + Axios リクエストインターフェース方式とパラメータ渡し方式の詳しい説明

目次1. リクエストを取得する: 2. 投稿リクエスト: 3. 拡張と補足Vue スキャフォールディ...

MySQLのロックについて理解しておくべきこと

1. はじめにMySQL ロックは、その範囲に応じて、グローバル ロック、テーブル ロック、行ロック...

Link と @import の違いを詳しく見る

ページで CSS を使用する主な方法は、スタイル属性値をインラインで追加する方法、ページ ヘッダーで...