Nginx rtmp モジュールのコンパイル ARM バージョンの問題

Nginx rtmp モジュールのコンパイル ARM バージョンの問題

今日は一日中作業して、ついに nginx をコンパイルして rtmp モジュールのサポートを追加しました。その過程で多くの問題に遭遇しました。この記事を記録しておき、このような問題に遭遇した学生の役に立つことを願っています。

1. 準備:

1. nginx ソースコードをダウンロードします: wget http://xiazai.jb51.net/202112/yuanma/nginx_jb51.rar

2. 依存ライブラリ libpcre.a のソースコードをダウンロードします: wget http://ftp.cs.stanford.edu/pub/exim/pcre/pcre-8.39.tar.gz

3. 依存ライブラリ libz.a ソースコードをダウンロードします: wget http://xiazai.jb51.net/202112/yuanma/pcre_jb51.rar

4. rtmp モジュールのソースコードをダウンロードします: GitHub - arut/nginx-rtmp-module: NGINX ベースのメディアストリーミングサーバー

最初の 3 つのライブラリのソース コードがダウンロードされた後、それらはすべて解凍されます。

2. ソースコードのコンパイル

pcre ライブラリと libz ライブラリは別々にコンパイルする必要はありません。nginx をコンパイルするときにモジュールを追加すると、一緒にコンパイルされます。

1. 設定する

cd nginx-1.20.2 //nginx ソース ディレクトリに切り替えます。/configure --prefix=/usr/sbin --add-module=/home/tianyexing/Documents/tools/nginx_rtmp/nginx-rtmp-module-master --with-http_ssl_module --with-debug --with-pcre=/home/tianyexing/Documents/tools/pcre/pcre-8.39 --with-zlib=/home/tianyexing/Documents/tools/zlib/zlib-1.2.11
 
// --prefix=/usr/sbin はインストールディレクトリを指定します。最終インストール中に生成されたプログラムは、このディレクトリに配置されます。 // --add-module=/home/tianyexing/Documents/tools/nginx_rtmp/nginx-rtmp-module-master は、rtmp モジュールをコンパイルします。このディレクトリは、上記でダウンロードしたソースコードを解凍したディレクトリです。 // --with-pcre=/home/tianyexing/Documents/tools/pcre/pcre-8.39 は、pcre モジュールをコンパイルします。このディレクトリは、上記でダウンロードしたソースコードを解凍したディレクトリです。 // --with-zlib=/home/tianyexing/Documents/tools/zlib/zlib-1.2.11 は、zlib モジュールをコンパイルします。このディレクトリは、上記でダウンロードしたソースコードを解凍したディレクトリです。

arm-himix200-linuxバージョンをコンパイルしたいのですが、nginxソースディレクトリのconfigureは--hostをサポートしていないので、

--with-cc=arm-himix200-linux-gcc も失敗するため、手動で変更することしか選択できません (変更ポイントについては後述します)。実行後、現在のディレクトリに objs と Makefile が生成されます。

1) objs/Makefileを修正する

2) nginx-1.20.2/auto/cc/conf ファイルを次のように変更します。

3) nginx-1.20.2/auto/types/sizeof を次のように変更します。

いくつかの変更は覚えていないので、他の変更を検索してみてください。

2. コンパイルエラー

objs/Makefileを実行するので、nginxソースディレクトリに作成するだけです。

1) openssl/ssl.h ヘッダー ファイルが見つかりません。例:

システムには既に openssl/ssl.h ファイルがあり、これはシステム ディレクトリ /usr/include にあります。

しかし、コンパイル時に、見つからないというメッセージが表示されます。arm バージョンのコンパイルに関係があるかどうかはわかりません。たまたまこの arm バージョンの openssl ヘッダー ファイルを持っているので、ここでは気にせず、どこか別の場所から openssl ディレクトリをコピーして直接使用しました。ただし、ヘッダー ファイル ディレクトリを追加した後、objs/Makefile を変更する必要があります。新しく追加したヘッダー ファイル ディレクトリは、nginx ソース コード ディレクトリ src にあり、変更内容は次のとおりです。

この CORE_INCS は、nginx をコンパイルするために使用されるヘッダー ファイルです。

これは、他のモジュール、nginx-rtmp、pcre、zlib で使用される可能性のあるヘッダー ファイル ディレクトリです。

2) IPv6の問題

この定義が見つからないというメッセージが表示されますが、この定義はシステム内に存在します。ここでは気にする必要はありません。ipv6 は使用されていないため、関連するコードはコメントアウトされています。

3) アーカイブにインデックスがありません。ranlib を実行してインデックスを追加します ---- ライブラリ プラットフォームの不一致の問題

何度もコンパイルされているため、x86 バージョンと arm バージョンの両方がコンパイルされており、その後 make clean がありません。ここでは以前の x86 バージョンのライブラリが使用されているため、ここでエラーが表示されます。arm-himix200-linux バージョンをコンパイルしたいので、次のようなライブラリ情報を確認してください。

したがって、make clean を実行してから、上記の configure を実行して Makefile を再生成する必要があります。

4) SSLライブラリと暗号ライブラリが見つかりません

objs/Makefileには以下のリンクがあります

最後のリンクにエラーがあります

以前、このライブラリの arm バージョンをコンパイルし、絶対パスに直接変更しました。これら 2 つのライブラリがない場合は、Google で検索してください。

ついに ARM バージョンと x86 バージョンをコンパイルしました。

3. ターゲットボード上での実行

実行のために arm バージョンにコピーすると失敗しましたが、プロンプト メッセージは表示されませんでした。その結果、nginx -s reload で次のようなエラー メッセージが表示されました。

configure 中に、インストール ディレクトリ --prefix=/usr/sbin が指定されているためです。コンパイルが完了すると、/usr/sbin の下に 3 つの新しいディレクトリ sbin、conf、logs が作成されます。ディレクトリは次のとおりです。

そこで、arm ボード上に対応する sbin、conf、logs ディレクトリを作成し、それらのディレクトリ内のすべてのファイルをそこにコピーしました。結果は成功しました。

ポート 1935 でリッスンしていることが確認されています。

arm バージョンは以前にコンパイルされましたが、configure 中にプレフィックスで指定されたインストール パスが PC 上のディレクトリであるため、正常に実行できず、結果として上記のような open() エラーが発生していました。 --prefix で指定されたディレクトリが configure 中にターゲット ボード上に存在しない場合、操作は失敗します。これを変更するにはどうすればよいですか?まだ見つけていないので、誰か知っていたら教えてください。

nginx rtmp モジュールの arm バージョンのコンパイルに関するこの記事はこれで終わりです。より関連性の高い nginx rtmp モジュールのコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Nginxはnginx-rtmp-moduleモジュールを使用してライブブロードキャストルーム機能を実現します。

<<:  HTML webpackプラグインの使用に関する簡単な分析

>>:  CSS を使用して三角形を実装する一般的な手法 (複数の方法)

推薦する

TomcatはNginxリバースプロキシのクライアントドメイン名を取得します

質問Nginx リバース プロキシの後、Tomcat アプリケーションは、クライアント ブラウザーの...

CSS マージンの重複と解決策の探索の詳細な説明

最近、CSS 関連の知識ポイントをいくつか見直し、CSS における典型的なマージンの重なりの問題を整...

純粋なJSを使用してセカンダリメニュー効果を実現します

この記事の例では、セカンダリメニュー効果を実現するためのJSの具体的なコードを参考までに共有していま...

MySQL で datetime 型のデフォルト値を設定する方法

Navicat クライアントを通じてデフォルトの日時値を変更する際に問題が発生しました。データベース...

CSSリンクと@importの違いの詳細な説明

HTML に CSS を追加するにはどうすればいいですか? HTML で CSS を設定する方法は ...

uniappのグローバル変数実装の詳細な説明

序文この記事では、uniapp グローバル変数の実装方法をいくつかまとめています。詳細な知識は、uV...

MySQL実行計画の詳細な分析

序文前回の面接では、実行計画について質問されたとき、多くの人がそれが何なのか知りませんでした。実行計...

WiFi 開発 | WiFi ワイヤレス テクノロジーの紹介

目次WiFiワイヤレステクノロジーの紹介1. WiFiテクノロジーの概要2. ESP8266の紹介W...

MySQL でパーティション分割後にクエリを実装するために MRG_MyISAM (MERGE) を使用する例

大量のデータベース データを最適化することは非常に高度な科学であり、開発者が習得する必要がある専門的...

4つのファイル拡張子 .html、.htm、.shtml、.shtm の違い

ウェブページを作り始めたばかりの友人の多くは、拡張子が非常に多いことに気づきます。実際、htm と ...

Dockerコンテナ間のホスト間通信 - オーバーレイベースの実装方法

オーバーレイネットワーク分析組み込みのホスト間ネットワーク通信は、常に Docker の待望の機能で...

Nginx セッション共有問題の解決策の分析

この記事は主に、Nginx セッション共有の問題に対する解決策を紹介します。記事内のサンプル コード...

MySQL 8.0 Windows zip パッケージ版の詳細なインストール手順

MySQL 8.0 Windows zipのインストール手順は次のように紹介されています。準備する:...

jQueryはシャトルボックス効果を実現します

この記事では、シャトルボックス効果を実現するためのjQueryの具体的なコードを参考までに紹介します...

幅の比率に応じて高さを変えるCSSを実装するいくつかの方法

[解決策1: パディングの実装]原理:要素の padding の値がパーセンテージの場合、このパーセ...