C/C++による · C/C++ Java ruby, python a.out.class.java.cc, .c 0 1 0 1 1 1 1 ... -g...

31
C/C++ʹΑΔ γεςϜϓϩάϥϛϯάج (2) C/C++ޠݴͷ։ ڥ2013.09.30 [再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

Transcript of C/C++による · C/C++ Java ruby, python a.out.class.java.cc, .c 0 1 0 1 1 1 1 ... -g...

C/C++によるシステムプログラミング基礎

(2) C/C++言語の開発環境

2013.09.30

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

開発環境

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

実習環境の用意Note PC の Linux 環境を起動root ではないユーザで作業する一般ユーザのアカウントを作成するroot でログインし「ユーザとグループ」

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

実習環境の用意ユーザの作成(ユーザを追加)既存の場合はそれを使って良い名前等は任意

click!

click!

適切な内容を記入

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

実習環境の用意ユーザが作成されたことを確認root から「ログアウト」作成したユーザでログイン

確認ログアウト

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

実習環境の用意「GNOME端末」を開く「Emacs テキスト・エディタ」か「GNOMEテキスト・エディタ」を開く

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

プログラムの実行まで結局はCPUの理解するバイト列になる

Java VM

0 11 0 00 1 1

1 1 01 10 0 0 1

0 11 0 00 1 1

1 1 01 10 0 0 1

0 11 0 00 1 1

1 1 01 10 0 0 1

Interpreter

0 11 0 00 1 1

1 1 01 10 0 0 1

コンパイル

実行

コンパイル

実行

実行 実行

実行

C/C++ Java ruby, python

a.out

.class

.java.cc, .c

0 11 0 00 1 1

1 1

実行時のバイナリ生成 (Runtime comper, Just-in-time compiler)

0 11 0 00 1 1

1 1

実行時のバイトコード生成

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

プログラムの実行まで結局はCPUの理解するバイト列になる

Java VM

0 11 0 00 1 1

1 1 01 10 0 0 1

0 11 0 00 1 1

1 1 01 10 0 0 1

0 11 0 00 1 1

1 1 01 10 0 0 1

Interpreter

0 11 0 00 1 1

1 1 01 10 0 0 1

コンパイル

実行

コンパイル

実行

実行 実行

実行

C/C++ Java ruby, python

a.out

.class

.java.cc, .c

0 11 0 00 1 1

1 1

実行時のバイナリ生成 (Runtime comper, Just-in-time compiler)

0 11 0 00 1 1

1 1

実行時のバイトコード生成

Eclipse

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

C/C++ の開発環境LinuxGNU C/C++ compiler, make, GDBgedit 等で編集 or Windows から drag&drop

cygwinWindows上で GNU software を使う環境cygwin terminalc:¥cygwin¥home¥ユーザ名 がホーム

Eclipse CDT後述

Visual Studio[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

まず書いてみよう下のプログラムを helloworld.cc という名前で作成g++ helloworld.cca.out (or a.exe) ができるので ./a.out (or a.exe)で実行// helloworld.cc

#include <iostream>

using namespace std;

intmain(int argc, char *argv[]){ cout << "Hello World!" << endl;}

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

Linux環境でのプログラミング自分のアカウント(rootでないもの)でログインするsyspro-2013 というディレクトリ(フォルダ)を作成

自分のホーム  フォルダを開く

開いたフォルダで右クリックフォルダの作成を選ぶ

適当な名前(syspro-2013)を付ける

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

Linux環境でのプログラミング作成したフォルダに講義回のフォルダを作成その中にファイルを作成し名前を付けるC++なら .cc や .cpp で、Cなら.cで終わる

作成したフォルダに講義回のフォルダ(今回は02)を作成し、それを開く

右クリックで、「ドキュメントの作成」から「空のファイル」を選択

適切な名前を付ける(ここでは helloworld.cc)

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

Linux環境でのプログラミングエディタで開いてプログラムを入力gedit や Emacs など

作成したファイルで右クリックメニューから gedit や Emacsを選ぶ

プログラムを入力したら保存  { } や ; を忘れないように

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

Linux環境でのプログラミングソースプログラム(入力したプログラム)の入っているフォルダを端末で開くg++, gcc などでコンパイル

ファイルを保存したフォルダで右クリック「端末の中に開く」を選ぶ

この機能がない場合は、端末を開いて cd で移動

開いた端末で g++ や gcc を実行

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

もう一つ書いてみよう

/* sys-pro01.c */

#include <stdio.h>

intmain(int argc, char *argv[]){ int i, c; for (i=0; i < 10; i++) { c += (i+1); printf(“How are you?\n”); } printf(“sum is %d\n”, c);}

C言語のプログラム (sys-pro01.c)gcc sys-pro01.c でコンパイル./a.out で実行

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

Linux環境でのプログラミングVMwareの環境ではWindowsからファイルをdrag & drop でコピー可能

ドラッグ&ドロップ Linuxでフォルダを開いておくと良い

syspro-01.c や makefile は授業支援システムにあるので、ダウンロードしてコピーすると良い

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

コンパイラのオプションgcc, g++ には多数のオプションがある読み込むインクルードファイルの在処リンクするライブラリの指定最適化指定  …など

ここでは -o と -g を使う-o ファイル名 a.out ではない名前に出力-g デバッガ(後述)のための情報を生成オプション前後や指定子の前後は space が切れ目(-g-ofile ではなく -g -o file)

それぞれhelloworld, sys-pro01 という名前に生成[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

makeの活用g++ -o helloworld helloworld.ccgcc -o sys-pro01 sys-pro01.c長いコマンドを繰り返し打つのは大変間違える危険性

make ルールに従ってコンパイル作業を処理

次の内容を makefile に保存helloworld, sys-pro01 を消してから(ある場合) makerm helloworld sys-pro01make

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

## makefile#

CXX = g++CC = gccCXXFLAGS = $(CXXINCLUDE) $(DEBUG)CFLAGS = $(INCLUDE) $(DEBUG)CXXINCLUDE =INCLUDE =DEBUG =## DEBUG = -g

TARGET = helloworld sys-pro01

all: $(TARGET)#helloworld: helloworld.cc $(CXX) -o $@ $(CXXFLAGS) $<

sys-pro01: sys-pro01.c $(CC) -o $@ $(CFLAGS) $<

clean: -$(RM) $(TARGET)

# で始まる行はコメント= はマクロ指定。$ (左辺の文字列) が出現したら右辺の文字列に置き換わる

マクロの右辺が変数でも良い

: で区切られているのは生成ルール。make だけだと最初の生成ルールを使う。make helloworld とかすると、特定の生成ルールのみが使われる。

生成ルールが呼ばれると、 :の右のファイル群の存在を確認。無ければ生成する。

ファイルが存在したら、コマンドを実行(複数行も可)

注) clean: の行は : の右は空(改行)- で始まる行は失敗しても停止しない[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

makeの活用default rule があるので下のように書くだけでも良い

% mv makefile makefile-1

右のmakefileを作成

% make clean% make helloworld% make sys-pro01% make clean% make all

## makefile#

CXXFLAGS = $(CXXINCLUDE) $(DEBUG)CFLAGS = $(INCLUDE) $(DEBUG)CXXINCLUDE =INCLUDE =DEBUG =##DEBUG = -g

TARGET = helloworld sys-pro1

all: $(TARGET)

clean: -$(RM) $(TARGET)

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

gdb の利用プログラムがどのように動いているのか?処理の流れ、変数の値

デバッガを活用する(準備) コンパイル時に -g オプションgdb 実行ファイル   で起動

list [行番号] プログラムファイルの表示。行番号は省略可能(次を表示)

break 行番号 その行に来たら止まる

print 変数名 変数の値を表示

display 変数名 break で止まる度に変数を表示

run 実行

cont 再開。直後に改行を打つと繰り返し。[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

(gdb) list1 /* sys-pro01.c */2 3 #include <stdio.h>4 5 int6 main(int argc, char *argv[])7 {8 int i, c;9 for (i=0; i < 10; i++) {10 c += (i+1);(gdb) 11 printf("How are you?\n");12 }13 printf("sum is %d\n", c);14 }(gdb) break 11Breakpoint 1 at 0x100000edc: file sys-pro01.c, line 11.(gdb) display i

No symbol "i" in current context.(gdb) runStarting program: /.../../sys-pro01 Reading symbols for shared libraries +. done

Breakpoint 1, main (argc=1, argv=0x7...) at sys-pro01.c:1111 printf("How are you?\n");(gdb) print c$1 = 1606422611(gdb) display i1: i = 0(gdb) contContinuing.How are you?Breakpoint 1, main (argc=1, argv=0x7f.....) at sys-pro01.c:1111 printf("How are you?\n");1: i = 1(gdb)

改行は前のコマンドの繰り返し

例) sys-pro1 の debug

iの定義に辿り着いていないので見えない

設定したブレークポイントで停止

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

IDE の利用IDE(統合開発環境)Eclipse CDTVisual Studioこの講義ではメモリ空間を見るのにはLinuxを基本とする → 割り付け構造が単純それ以外のプログラミングは cygwin + Eclipse CDT でも構わない

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

Eclipse CDTの導入大まかな流れWindows 32bit 版の Eclipse CDTを入手D:¥Eclipse CDT とかのフォルダを作るこれまでのEclipseと独立にするzip アーカイブを用意したフォルダに展開D:¥Eclipse CDT¥eclipse に eclipse.exe という実行コマンドがあるので起動Workspace を聞かれるので、Javaのと別のものを指定すると良い

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

Eclipse CDTの導入

1. マイコンピュータを開く 2. DドライブにEclipse CDTというフォルダを作る

3. ダウンロードしたファイルをダブルクリックして展開「フォルダ自動生成」「解凍先を開く」「フォルダ無視」のチェックが外れていることを確認

解凍フォルダを指定、を選ぶ[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

Eclipse CDTの導入

4. 解凍先に D:¥Eclipse CDT を選ぶ

• Eclipse CDT¥eclipseにある eclipse.exe を右クリックしてドラッグ

•適当な所で離して、「ショートカットを作成」を選ぶ

•適当な名前を付ける

解凍された Eclipse の実行ファイルはshortcutを用意しておくと便利

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

Eclipse CDTの起動

5. D:¥Eclipse CDT¥eclipseにあるeclipse.exe か作成したショートカットをダブルクリック

6. Workspaceのフォルダを聞かれるので、Javaのものと別のフォルダを指定すると良い

(この例では C:¥Users¥admin  ¥workspace-cpp)

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

プロジェクトの作成

C++ ProjectかC Projectを選ぶ

使う言語に合わせてC++/C Projectを作成Toolchains に Cygwin GCCを選ぶ

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

ソースフォルダを作成左のプロジェクトを選んで右クリックフォルダを作成、下に適切な名前を入れる

ここではsrcと入力[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

ソースプログラムの作成フォルダで右クリックしSource Fileを追加ファイル名を指定し、プログラム記述

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.

ビルドと実行Buildを選んでコンパイル、その後実行Buildをしないと、右下のようなエラーが出ることがある

[再配布禁止] © 2013-2014, Toshio Hirotsu, All rights reserved.