GoGPT Best VPN GoSearch

OnWorksファビコン

makepp_tutorial_compilation-クラウドでのオンライン

Ubuntu Online、Fedora Online、Windowsオンラインエミュレーター、またはMACOSオンラインエミュレーターを介してOnWorks無料ホスティングプロバイダーでmakepp_tutorial_compilationを実行します

これは、Ubuntu Online、Fedora Online、Windowsオンラインエミュレーター、MACOSオンラインエミュレーターなどの複数の無料オンラインワークステーションのXNUMXつを使用してOnWorks無料ホスティングプロバイダーで実行できるコマンドmakepp_tutorial_compilationです。

プログラム:

NAME


makepp_tutorial_compilation-Unixコンパイルコマンド

DESCRIPTION


コンパイルコマンドの機能をよく理解している場合は、このマニュアルページをスキップしてください。

プログラミングのクラスで教えられている人は、悲惨なほど少ないようです。
プログラムを作成したら、プログラムのコンパイルに取り掛かります。 初心者はどちらかXNUMXつに依存します
記憶されたコマンド、またはmakeの組み込みルール。 びっくりしました
最適化なしでコンパイルすることを学んだ非常にコンピュータリテラシーのある人々
彼らはそれがどれほど重要であるかを決して言われませんでした。 コンパイル方法に関する基本的な知識
コマンドが機能すると、プログラムの実行速度がXNUMX倍以上になる可能性があるため、少なくとも価値があります。
五分。 このページでは、Cをコンパイルするために知っておく必要のあるすべてのことについて説明します
またはUnixのほぼすべてのバリアント上のC++プログラム。

名前を除いてC++のコンパイルは同じであるため、例は主にC用です。
コンパイラのは異なります。 ソースコードをというファイルにコンパイルしているとします。
「xyz.c」で、「xyz」というプログラムを作成したいとします。 何が起こらなければなりませんか?

次のようなコマンドを使用して、プログラムをXNUMXつのステップでビルドできることをご存知かもしれません。

cc -g xyz.c -o xyz

これは機能しますが、XNUMX段階のプロセスが隠されています。
makefileの書き込み。 (実際には、XNUMXつ以上のステップがありますが、必要なのは
それらのうちのXNUMXつを理解してください。)複数のモジュールのプログラムの場合、通常、XNUMXつのステップは次のとおりです。
明示的に分離されています。

編集
最初のステップは、CまたはC++ソースコードをというバイナリファイルに変換することです。
オブジェクトファイル。 オブジェクトファイルの拡張子は通常「.o」です。 (最近の場合
プロジェクトでは、「。lo」はわずかに異なる種類のオブジェクトファイルにも使用されます。)

Unixでオブジェクトファイルを作成するコマンドは次のようになります。

cc -g -c xyz.c -o xyz.o

「cc」はCコンパイラです。 代替のCコンパイラが使用されることもあります。 非常に一般的なものは
「gcc」と呼ばれます。 一般的なC++コンパイラはGNUコンパイラであり、通常は「g++」と呼ばれます。 事実上
Unix上のすべてのCおよびC++コンパイラは、コマンドの残りの部分で同じ構文を持っています(少なくとも
基本的な操作の場合)、唯一の違いは最初の単語になります。

「-g」オプションの機能については後で説明します。

「-c」オプションは、出力として「.o」ファイルを生成するようにCコンパイラに指示します。 (そうでない場合
「-c」を指定すると、XNUMX番目のコンパイルステップが自動的に実行されます。)

「-oxyz.o」オプションは、オブジェクトファイルの名前をコンパイラに通知します。 あなたはできる
オブジェクトファイルの名前がソースの名前と同じである限り、これを省略します
「.o」拡張子を除くファイル。

ほとんどの場合、オプションとファイル名の順序は重要ではありません。 XNUMX
重要な例外は、出力ファイルが「-o」の直後に続く必要があることです。

連結
プログラムを構築するXNUMX番目のステップはと呼ばれます 連結。 オブジェクトファイルを実行できません
直接; それは中間形式でなければなりません リンク 他のコンポーネントに
プログラムを作成します。 その他のコンポーネントには、次のものが含まれる場合があります。

・ライブラリ。 A ライブラリ、大まかに言えば、オブジェクトモジュールのコレクションです。
必要に応じて含まれています。 たとえば、プログラムが「printf」関数を呼び出す場合、
「printf」関数の定義は、システムCライブラリから含める必要があります。
一部のライブラリは自動的にプログラムにリンクされます(たとえば、
「printf」)なので、心配する必要はありません。

・プログラム内の他のソースファイルから派生したオブジェクトファイル。 あなたが書くなら
実際に複数のソースファイルが含まれるようにプログラムします。通常は、それぞれをコンパイルします。
ソースファイルを別のオブジェクトファイルにリンクしてから、それらをすべてリンクします。

当学校区の リンクス オブジェクトファイルのコレクションを取得するためのプログラムであり、
ライブラリとそれらをリンクして実行可能ファイルを作成します。 実行可能ファイルは
実際に実行するプログラム。

プログラムをリンクするコマンドは次のようになります。

cc -g xyz.o -o xyz

奇妙に思えるかもしれませんが、通常、同じプログラム( "cc")を実行してリンクを実行します。 何
表面下で発生するのは、「cc」プログラムがすぐに制御を
番号を追加した後の別のプログラム(リンカー、ローダーまたは「ld」と呼ばれることもあります)
複雑な情報をコマンドラインに追加します。 たとえば、「cc」は「ld」に次のように指示します。
システムライブラリには、「printf」などの関数の定義が含まれています。 あなたまで
共有ライブラリの作成を開始します。通常、「ld」を直接処理する必要はありません。

「-oxyz」を指定しない場合、出力ファイルは「a.out」と呼ばれます。
私にとって、完全に役に立たない、紛らわしい慣習である。 したがって、常に「-o」を指定してください
リンクステップ。

プログラムに複数のオブジェクトファイルがある場合は、上のすべてのオブジェクトファイルを指定する必要があります
リンクコマンド。

Why フォーム 必要 〜へ   ステップ
次のような単純なワンステップコマンドを使用してみませんか。

cc -g xyz.c -o xyz

より複雑なXNUMX段階のコンパイルの代わりに

cc -g -c xyz.c -o xyz.o
cc -g xyz.o -o xyz

内部的に最初のものがXNUMX番目に変換される場合は? 違いが重要なのは
プログラムに複数のモジュールがあります。 追加のモジュールがあるとします。
「abc.c」。 これで、コンパイルは次のようになります。

#XNUMX段階のコマンド。
cc -g xyz.c abc.c -o xyz

or

#XNUMX段階のコマンド。
cc -g -c xyz.c -o xyz.o
cc -g -c abc.c -o abc.o
cc -g xyz.o abc.o -o xyz

もちろん、最初のメソッドは内部でXNUMX番目のメソッドに変換されます。 これの意味は
コマンドが実行されるたびに、「xyz.c」と「abc.c」の両方が再コンパイルされます。 しかし、もしあなたが
「xyz.c」を変更しただけで、「abc.c」を再コンパイルする必要はないので、XNUMX行目のXNUMX行目-
ステージコマンドを実行する必要はありません。 これはコンパイルに大きな違いをもたらす可能性があります
特にモジュールが多い場合は時間がかかります。 このため、事実上すべてのmakefileが保持します
XNUMXつのコンパイル手順は別々です。

これはほとんど基本的なことですが、実際に必要な詳細がいくつかあります。
について知る。

デバッギング 最適化
通常、プログラマーはデバッグまたは速度のいずれかのためにプログラムをコンパイルします。 コンパイル
速度のために呼ばれます 最適化; 最適化を使用してコンパイルすると、コードが最大で実行される可能性があります
コード、プロセッサ、およびコンパイラに応じて、5倍以上高速になります。

そのような劇的な利益が可能であるのに、なぜあなたは最適化したくないのですか? 最も
重要な答えは、最適化によってデバッガーの使用がはるかに困難になるということです
(時には不可能)。 (デバッガーについて何も知らない場合は、学ぶ時が来ました。
基本を学ぶのに費やすXNUMX分またはXNUMX時間は、何度も返済されます
後でデバッグするときに節約できます。 GUIデバッガーから始めることをお勧めします
「kdbg」、「ddd」、「gdb」などはemacs内から実行されます(gdbの情報ページを参照してください。
これを行う方法の説明))最適化はステートメントを並べ替えて結合し、削除します
不要な一時変数であり、通常はコードを再配置して非常に
デバッガー内を追跡するのは難しい。 通常の手順は、コードを記述してコンパイルすることです。
最適化せずにデバッグしてから、最適化をオンにします。

デバッガーが機能するためには、コンパイラーは
最適化するだけでなく、シンボルの名前に関する情報をオブジェクトに入れることによって
ファイルを作成して、デバッガーが何と呼ばれるかを認識できるようにします。 これが「-g」コンパイルです
オプションはありません。

デバッグが完了し、コードを最適化したい場合は、「-g」を次のように置き換えるだけです。
「-O」。 多くのコンパイラーでは、追加することで最適化のレベルを上げることができます。
「-O」の後の数字。 また、増加する他のオプションを指定できる場合があります
状況によっては速度が向上します(メモリ使用量の増加とトレードオフの可能性があります)。 見る
詳細については、コンパイラのマニュアルページを参照してください。 たとえば、これは最適化コンパイルコマンドです
「gcc」コンパイラで頻繁に使用するもの:

gcc -O6 -malign-double -c xyz.c -o xyz.o

最高の状態を実現するには、さまざまな最適化オプションを試す必要があるかもしれません。
パフォーマンス。 コードごとに異なるオプションが必要になる場合があります。 一般的
言えば、「-O6」のような単純な最適化フラグは多くのコンパイラで機能し、通常は
かなり良い結果が得られます。

警告:まれに、プログラムが実際にはまったく同じことを行わない場合があります
最適化してコンパイルされます。 これは、(1)あなたが行った無効な仮定が原因である可能性があります
最適化なしでは無害でしたが、
コンパイラーは、最適化するときに物事を自由に再配置します。 または(2)悲しいことに、
コンパイラにもバグがあり、オプティマイザのバグも含まれます。 のような安定したコンパイラの場合
Pentiumのような一般的なプラットフォームでの「gcc」では、最適化のバグが問題になることはめったにありません(現在
2000年-数年前に問題がありました)。

コンパイルコマンドで「-g」または「-O」のいずれも指定しない場合、結果のオブジェクト
ファイルは、デバッグにも高速実行にも適していません。 どういうわけか、これは
デフォルト。 したがって、常に「-g」または「-O」のいずれかを指定してください。

一部のシステムでは、コンパイルとリンクの両方のステップで「-g」を指定する必要があります。 他の人に
(Linuxなど)、コンパイルステップでのみ提供する必要があります。 一部のシステムでは、「-O」
実際には、リンクフェーズでは別のことを行いますが、他のフェーズでは効果がありません。
いずれの場合も、両方のコマンドに「-g」または「-O」を指定しても問題はありません。

警告
ほとんどのコンパイラは、多くの一般的なプログラミングエラーをキャッチできます(例:
値を返すことになっている関数から値を返すのを忘れています)。 いつもの、
警告をオンにする必要があります。 これをどのように行うかは、コンパイラによって異なります(男性を参照)
ページ)、しかし「gcc」コンパイラでは、私は通常次のようなものを使用します:

gcc -g -Wall -c xyz.c -o xyz.o

(警告があるため、「-Wall」の後に「-Wno-uninitialized」を追加することもあります。
通常、最適化するときに発生するのは間違っています。)

これらの警告により、デバッグにかかる​​時間を大幅に節約できました。

その他 便利 編集 オプション
多くの場合、必要なインクルードファイルは現在のディレクトリ以外のディレクトリに保存されます
ディレクトリまたはシステムインクルードディレクトリ(/ usr / include)。 これは頻繁に発生します
インクルードファイルに付属のライブラリを使用して、関数またはクラスを定義しています。

たとえば、Qtライブラリを使用するアプリケーションを作成しているとします。 あなたは
Qtライブラリのローカルコピーをにインストールしました / home / users / joe / qt、ということを意味し
インクルードファイルはディレクトリに保存されます / home / users / joe / qt / include。 あなたのコードでは、あなたは
次のようなことができるようになりたい:

#含む



#include "/home/users/joe/qt/include/qwidget.h"

を使用して、別のディレクトリでインクルードファイルを探すようにコンパイラに指示できます。
「-I」コンパイルオプション:

g ++ -I / home / users / joe / qt / include -g -c mywidget.cpp -o mywidget.o

通常、「-I」とディレクトリ名の間にスペースはありません。

C++コンパイラがファイルを探しているとき qwidget.h、見ます
/ home / users / joe / qt / include システムのインクルードディレクトリを調べる前に。 あなたはできる
必要な数の「-I」オプションを指定します。

使い方 ライブラリ
多くの場合、特定の外部ライブラリとリンクするようにリンカーに指示する必要があります。
標準Cライブラリの一部ではない関数を呼び出しています。 「-l」(小文字
L)オプションは、特定のライブラリとリンクすることを示しています。

cc -g xyz.o -o xyz -lm

「-lm」は、システム数学ライブラリとリンクすることを意味します。これは、使用している場合に必要になります。
「sqrt」のように機能します。

注意してください。 複数の「-l」オプションを指定すると、順序によって一部が異なる場合があります
システム。 含まれていることがわかっているときに未定義の変数を取得している場合
それらを定義するライブラリの場合、そのライブラリをコマンドの最後に移動してみてください。
行、またはコマンドラインの最後にもう一度含めることもできます。

必要なライブラリがシステムのデフォルトの場所に保存されていない場合があります
ライブラリ。 「-labc」は、というファイルを検索します libabc.a or libabc.so or libabc.sa 会場は
システムライブラリディレクトリ(/ usr / lib 何に応じて、通常は他のいくつかの場所も
実行しているUnixの種類)。 「-L」オプションは、検索する追加のディレクトリを指定します
ライブラリ用。 上記の例をもう一度取り上げるには、Qtライブラリをインストールしたとします。
in / home / users / joe / qt、これはライブラリファイルがにあることを意味します / home / users / joe / qt / lib.
プログラムのリンクステップは次のようになります。

g ++ -g test_mywidget.o mywidget.o -o test_mywidget -L / home / users / joe / qt / lib -lqt

(一部のシステムでは、Qtでリンクする場合は、他のライブラリも追加する必要があります(たとえば、
"-L / usr / X11R6 / lib -lX11 -lXext")。 何をする必要があるかは、システムによって異なります。)

「-L」とディレクトリ名の間にスペースがないことに注意してください。 通常、「-L」オプション
影響を受けるはずの「-l」オプションの前に移動します。

どのライブラリが必要かをどうやって知るのですか? 一般的に、これは難しい質問であり、さまざまです
実行しているUnixの種類によって異なります。 関数のドキュメントまたは
使用しているクラスは、リンクする必要のあるライブラリを指定する必要があります。 使用している場合
外部パッケージの関数またはクラス。通常、リンクする必要のあるライブラリがあります。
と; ライブラリは通常、「libabc.a」または「libabc.so」または「libabc.sa」と呼ばれるファイルになります
「-labc」オプションを追加する必要がある場合。

一部 その他 紛らわしい 物事
通常適用されるオプションを指定できることに気付いたかもしれません
リンクステップでのコンパイル、および通常のリンクに適用されるオプション
コンパイルステップ。 たとえば、次のコマンドが有効です。

cc -g -L / usr / X11R6 / lib -c xyz.c -o xyz.o
cc -g -I / somewhere / include xyz.o -o xyz

無関係なオプションは無視されます。 上記のコマンドは、これとまったく同じです。

cc -g -c xyz.c -o xyz.o
cc -g xyz.o -o xyz

onworks.netサービスを使用してオンラインでmakepp_tutorial_compilationを使用する


無料のサーバーとワークステーション

Windows と Linux のアプリをダウンロード

Linuxコマンド

Ad




×
Advertisement
❤️ここでショッピング、予約、購入してください。料金はかかりません。これにより、サービスが無料で維持されます。