writer : Martin Brown (questions@mcslp.com), Freelance writer and consultant
 
http://www.ibm.com/developerworks/jp/linux/library/l-ccache/index.html

 

UNIXでC/C++を使ったアプリケーション開発での標準的なビルド・プロセスにおいては、gccのようなコンパイラーと、makeのように何らかのビルド・ツールを使います。makeやその他どんなCコンパイラーでも問題になるのは、Cのプリプロセッサーがヘッダー・ファイルをどう扱うかです。典型的なCソースファイルを見れば、様々なヘッダー・ファイルへの#include参照がいくつか入っています。

Cプリプロセッサー(cpp)はファイルをコンパイルする度に、こうした各ファイルを、また参照される予定のファイルをすべて構文解析し、そしてインクルードします。その内容を構文解析することによってcppは、ごく基本的な1 KBのソースファイルだったものを8 KBのソースファイルにし、やがて何十もの、時には何百ものソースファイルを取り込むのです。一般的な開発プロジェクトでは、関係のあるヘッダー・ファイルは様々なソースファイルに何度もインクルードされ、またそれぞれのヘッダー・ファイルが数多くの他のヘッダー・ファイルを参照している場合もあります。

典型的なビルドでは、makeツールは対象が最後にビルドされた後に変更されたファイルだけをコンパイルすることによって、大幅にプロセスを単純化します。例えばリスト1のディレクトリを見ると、foo.oオブジェクトは、対応するfoo.cソースファイルを最後に変更した時よりも古いことが分かります。一方bar.oはbar.cよりも新しくなっています。適切に設定されたMakefileを使えば、ソースから再コンパイルされるのはfoo.oのみになります。

makeでは変更されたソースファイルのみをコンパイルすることによって、コンパイルすべきソースファイルの数を制限しますが、それでもまだ無駄があります。プロジェクトをコンパイルする度に、アセンブラーそして最終的にマシンコードにコンパイルされるまでに、ソースファイルはcppに構文解析されます。各ファイルにとって見ると、これは毎回ヘッダー・ファイルを再構文解析することになっている可能性があります。ビルドのプロセス全体で考えると、同じヘッダー・ファイルを何度も構文解析し、プロセッサー・サイクルを浪費している可能性があります。さらに重要なことは、ビルドのプロセスが完了するまで待たせることによって、開発者の時間を浪費してしまうのです。チーム全体として見ると、複数の開発者がそのプロセスを何度も繰り返すかもしれず、しかも日によってはそれを同時に行う可能性もあることから、その影響はさらに重大です。


リスト1. ソース環境の例
                
total 808
-rw-------  1 mc  mc    5123 24 Jul 14:17 bar.c
-rw-------  1 mc  mc   39474 24 Jul 14:19 bar.o
-rw-------  1 mc  mc    7856 24 Jul 14:17 foo.c
-rw-------  1 mc  mc   28443 24 Jul 14:19 foo.o
-rwx--x--x  1 mc  mc  319742 24 Jul 14:19 foobar*
-rw-------  1 mc  mc    1045 24 Jul 14:21 foobar.h

ccacheを使う

ccache(compiler cacheの省略)ツールはコンパイルで生成された情報をキャッシュし、例えばヘッダー・ファイルのようにビルドの特定な部分のキャッシュ情報を使うことで、通常はcppで情報を構文解析するために使われるはずの時間を節約します。例えばリスト2のファイルのコンパイルについて言えば、(foobar.hが他のヘッダー・ファイルへの参照を含んでいるとすると)ccacheはincludeステートメントを、cppで構文解析した方のファイルで置き換えるのです。これほど単純なのです。ccacheは実際に内容を読み取って理解し解釈するのではなく、(それまではファイルとなるべき最終テキストであった)あとはコンパイルするだけだったものを、単にコピーするのです。


リスト2. ソースファイルの内容
                
#include "foobar.h"
void main(void)
{
}

インストール

ccacheのインストールも、それを使うのも、皆さんが想像するほど複雑なものではありません。ccacheは今までのコンパイラーの使い方には全く影響を与えることはなく、皆さんとコンパイラーの間のインターフェースとして動作するのです。ですから、必要に応じて使うか使わないかという選択ができます。ccacheをインストールするにはSambaグループから直接ソースをダウンロードするか、あるいはローカルのミラー(参考文献)からダウンロードします。そしてダウンロードしたものを解凍します。

$ bunzip2 -c ccache-2.3.tar.bz2|tar xf -

次のディレクトリに変更します。

$ cd ccache-2.3

configureを実行します。

$ ./configure

ビルドします。

$ make

そして最後にccacheをインストールします。

$ make install

これで準備完了です。

展開

先に述べた通り、ccacheは皆さんと通常のコンパイラーの間に位置することによって動作します。ですからgccを呼ぶ代わりに、gccを最初の引き数としてccacheを呼びます。例えばコマンドラインからファイルをコンパイルするには、通常次のようにします。

$ gcc foo.c

ccacheを使うには次のようにタイプします。

$ ccache gcc foo.c

こうしたファイルを一度だけコンパイルしても、特にccacheを使ってファイルをコンパイルするのが初めてであれば、コンパイル情報はまだキャッシュされていないので、何ら利点は感じないでしょう。ですから、一般的にはccacheを設定して、恒久的にメインのコンパイラーとして入れ替える方が効果的です。そのためにはCC環境変数の値を設定します。

$ export set CC='ccache gcc'

ccacheをプロジェクト・ベースでのみ使用可能にしたいのであれば、例えばPerlのようなサードパーティーのツールをコンパイルする時にのみ使用可能にしたいのであれば、環境のトリックを使うか、configureスクリプトでそのように指定するか、またはどのCコンパイラーを使うかを指定するようなコマンドを作ります。

キャッシュを制御する

ccacheはデフォルトで、カレント・ユーザーのホーム・ディレクトリ($HOME/.ccache)内のディレクトリを使ってキャッシュ情報を保持します。チーム環境では、誰もがビルド中にキャッシュ情報を使えるように、中心となる場所をキャッシュ用に使いたいでしょう。もう一つの環境変数CCACHE_DIRがキャッシュ・ディレクトリの位置を規定します。単一マシンの環境では、必要な人が誰でもアクセスできるようなディレクトリにこれを置きます。充分なメモリーがあるとして、さらに高速にするためには、tmpfsを使ってマウントされたディレクトリを使います。これによってさらに10%から25%高速化することができます。

ネットワークを経由して接続したマシンでccacheを使用するのであれば、必ず共有するディレクトリがNFSでエクスポートされ、各クライアントにマウントされるようにします。この場合でも、さらに高速化したい場合にはtmpfsファイルシステムを使うことができます。

キャッシュをさらに細かく制御できるようなオプションが他にも幾つかあります。

  • CCACHE_LOGFILE環境変数は、ログファイル(ccacheを使うと中身が入ります)の場所を定義します。
  • ccacheで-sコマンドライン・オプションを使うと、キャッシュのパフォーマンス統計が分かります(リスト3)。
  • -Mコマンドライン・オプションを使うと、キャッシュの最大サイズを設定できます。デフォルトは1 GBです。キャッシュに対する設定はキャッシュ・ディレクトリに書き込まれます。ですから別々のユーザーやグループに対して、別々の場所で別々のキャッシュ・サイズを設定することができます。
  • -Fオプションは最大ファイル数を設定しますが、一番近い16の倍数に丸められます。-Mと同様、デフォルトを変更したい時にのみ使用します。
  • -cオプションはキャッシュを整理します。ccacheは実行中に情報を更新するため、通常はこれを使うべきではありませんが、しばらく使っていなかったキャッシュ・ディレクトリを再び使用するような時には、このオプションを使うことができます。
  • -Cオプションはキャッシュを完全にクリアします。

リスト3. ccacheキャッシュの統計
                
cache hit                             44
cache miss                           152
called for link                      107
compile failed                        11
no input file                          2
files in cache                       304
cache size                           8.8 MB
max cache size                     976.6 MB

初期オプションを設定し、ディレクトリやキャッシュ・サイズを設定してしまえば、何も変更する必要はありません。定期的なメンテナンスを行う必要もありません。

ccacheとdistccを組み合わせる

皆さんは、同じくSambaグループの別のツールdistccを既にご存じかも知れません。distccを使うと、何台かのマシンにコンパイルのプロセスを分散させることができます。そのため、あたかもmakeで(-jコマンドライン・オプションを使って)複数ジョブ・オプションを使ったかのように、起こり得る同時コンパイルの数を実質的に増やすことができます。各ホストでは、ソースファイルを構文解析前の最終形式で受け付けてから(出来上がったオブジェクト・ファイルを戻す前に)ファイルをローカルでコンパイルするデーモンがあり、distccシステムはこのデーモンを使うことで動作します。

distccはソースファイル全体を分散するので、効果があるのは一つ以上のソースファイルがあるようなプロジェクトのみです。適切に使った場合、同等な新しいノードを追加する毎にビルド時間が減少する割合は、直線的な減少よりもやや少ないものになります。

distccは構文解析された状態でファイルを分散するので、Cのプリプロセス部分をスピードアップするccacheとdistccを組み合わせて、オブジェクト・コードを生成する実際のコンパイルを行うことができます。distccとccacheをこの方法で使うには、自分のホストでdistccを設定し、メインの開発マシンでdistccとccacheを設定します。

リスト4のように、プロジェクトをビルドしたいマシンで環境変数を設定します。


リスト4. ccacheとdistccを使うための環境変数
                
export set DISTCC_HOSTS='localhost atuin nautilus pteppic kernel'
export set CCACHE_DIR=/Data/Cache/CCache
export set CCACHE_PREFIX=distcc
export set CCACHE_LOGFILE=/Data/Cache/CCache.log
export set CC='ccache gcc'

環境変数は次のように定義されます。

  • DISTCC_HOSTS は作業を分散する先のホストを指定します。
  • CCACHE_DIR はccacheディレクトリの位置を指定します。
  • CCACHE_PREFIX はccacheが(プリプロセスの後)ソースをコンパイルする真のコンパイラーを呼ぶ時に使うプレフィックスを指定します。
  • CC は最初に使うCコンパイラー(ccache)の名前を設定します。

同時に実行するコンパイルの数を-jオプションで指定してmakeを実行すると、ファイルはdistccのホストの一台に分散される前に、最初にccacheで(必要な場合にはそのキャッシュを使って)構文解析されます。

distccはコンパイルのプロセスをスピードアップしますが、環境の持つ基本的な制約を変更するわけではありません。例えば、makeが操作する同時ジョブの数は、使用できるCPUの数の2倍以上にすべきではありません。例えば4台の2CPUマシンの場合、ジョブの値を16以上に設定しても、ほとんどスピードの改善は感じられないでしょう。

統計

さて、全てが設定できたところで、どのくらい差があるものかを見てみましょう。ここではPerlをビルドする一連のテストを実行しました。ccacheは構文解析されたヘッダー・ファイルをキャッシュした時に最も効果があるので、コンパイルするにはよく身の詰まったものが必要です。これは単にmakeフェーズであり、標準のconfigureを(configure.gnuを使って)実行した後に起こります。コードのコンパイルに関係したものだけではなく、全てのステージを含んでいますが、非コンパイラー操作は全体的な統計には影響しません。

先に述べた通り、ccacheの効果は最初のコンパイルでは感じられません。以前のプリプロセッサーのパスを再利用する時に、その違いが出るのです。表1に示す再コンパイル時間は、メインのPerlソース・ディレクトリにあるCソースファイルのそれぞれを、ごくわずかいじった結果に基づいています。ここでは4ノードのネットワークで同時に行われるdistccジョブの様々な値を使って、ごく普通のgccでビルドした場合、ccache+gccでビルドした場合、ccache+distcc+gccでビルドした場合の時間を計測しています。


表1. 再コンパイル時間
環境 時間
gcc (1回目)   8m02.273s
gcc (再コンパイル)   3m30.051s
ccache+gcc (1回目)   8m54.714s
ccache+gcc (再コンパイル)   0m45.455s
ccache+distcc+gcc -j4   4m14.546s
ccache+distcc+gcc -j4 (再コンパイル)   0m38.985s
ccache+distcc+gcc -j8   3m13.020s
ccache+distcc+gcc -j8 (再コンパイル)   0m34.380s

何と素晴らしい! ccacheを使うだけでPerlのビルド時間をほとんど3分(実は2分45秒ですが)の短縮です。これはすべて、ccacheが事前に構文解析されたヘッダー・ファイルを保存しておいて使うためであり、各ソースファイルに対して常にcppを再実行することがないからです。プロセスの中にdistccも取り入れれば、再コンパイル時間が少し早くなると同時に、全体的なスピードも向上します。

まとめ

この記事では、ccacheのように比較的単純で使いやすいツールを使うことによって、どれほどスピードが改善されるかを見てきました。ccacheをdistccと組み合わせて使えば、さらにコンパイル時間を短縮することができます。こうしたツールをチーム環境で使えば、コンパイル時間だけで毎日何時間も節約できることになります。開発メンバーにとってはコーヒー・ブレークの時間が少なくなることを意味するかも知れませんが、アプリケーションの開発時間も短縮できるのです。


参考文献

 

빨리 집에갈려면 익혀둬야 할 기술 

설명 #

"함수포인터"는 C언어에서 자주 쓰이는 기본 용법중 하나입니다. 정의는 다음과 같습니다.
선언된 함수가 저장된 메모리 번지값을 담고 있는 포인터 변수
하지만 이것을 왜 보통의 포인터와는 달리 특별취급하냐면 다음과 같은 이유 때문입니다.
  1. 일반 포인터 변수와는 조금 다르게 보이는 문법으로 선언됩니다. 예를 들어 함수 포인터 변수는 다음과 같이 선언합니다. (functionPtr이 포인터 변수명이 됩니다)
    void (*functionPtr)(const char *s_)
    
  2. 함수포인터는 실행부분을 가리키는 포인터 변수인탓에 () 연산자를 사용할 수 있습니다. 즉, 위의 functionPtr은 아래와 같이 실행가능합니다.
    functionPtr("바보나라~")
    

주로 함수포인터는 콜백(callback)을 구현하는데 사용됩니다. 어떤 라이브러리를 제작할 때 개발자가 어떤 "경우"에 대한 반응을 함수로 작성하고 이를 다시 라이브러리에서 호출하도록 작성하고자 할 때, 개발자가 작성한 함수의 포인터를 넘겨받아 실행하도록 하면 아주 유용할 때가 많습니다. (대표적인 예가 win32 api에서 윈도우 프로시져를 WNDCLASS의 lpfnWndProc맴버에 등록하는 부분을 들 수 있습니다) 즉, 함수를 마치 변수와 같이 취급하는 것이 가능해집니다.

예제 #

아래 예제는 함수포인터를 활용한 간단한 예제입니다.
#include <stdio.h>

void testout1(const char *s) {
  printf("시험출력1:%s\n", s);
}

void testout2(const char *s) {
  printf("시험출력2:%s\n", s);
}

// 함수포인터 변수
void (*funcPtr)(const char *s);

int main() {
  // 함수포인터를 testout1, testout2로 각각 대입해보고 실행해본다.
  funcPtr = testout1;
  funcPtr("테스트");
  funcPtr = testout2;
  funcPtr("테스트");
}

실행결과는 아래와 같습니다.
시험출력1:테스트 시험출력2:테스트
main()안에서는 funcPtr만 실행했지만 마치 testout1, testout2를 각각 실행한 것과 같은 효과가 있음을 알 수 있습니다.

typedef 거는 법 #

함수포인터를 어떤 포인터 변수로서 활용하고 싶을 때 typedef를 활용하면 매우 편리합니다. 실제로 win32 API에서는 윈도우 프로시저 함수포인터형으로 WNDPROC라는 타입이 있습니다. (이부분을 보면 어느정도 사용법에 대한 느낌이 올겁니다) winuser.h 헤더화일에서 검색해보면 다음과 같이 선언되어있습니다.
typedef LRESULT(CALLBACK *WNDPROC)(HWND,UINT,WPARAM,LPARAM);
실제로 사용될 때에는 다음과 같이 사용됩니다.
LRESULT CALLBACK winproc1(HWND,UINT,WPARAM,LPARAM) { }; ... WNDPROC winprocPtr = winproc1; ...
꽤 유용한 문법이니 알아두시면 좋습니다.

주의사항 #

함수포인터는 알아두면 상당히 유용한 기법이지만 사용시에는 다음과 같은 부분을 주의해야합니다.
  1. 대입되지 않은 (NULL값상태의) 함수포인터를 실행하지 않도록 주의해야합니다. 초기화를 항상 NULL로 해두고 실행전에 검사하는 것도 좋은 방법입니다.
  2. "같은 함수 포인터 타입"이라는 것을 증명하려면, 반환값, 매개변수의 타입 및 개수가 모두 일치해야합니다. 보통 하나라도 다른 함수포인터값을 대입하면 컴파일시 오류가 나게 됩니다.


출처 : http://www.redwiki.net/wiki/wiki.php/%C7%D4%BC%F6%C6%F7%C0%CE%C5%CD


출처 : http://starplaying.tistory.com/114



아이팟 터치 & 아이폰 개발 with 툴체인 2 아이폰 개발


툴체인 설치를 위해 고생한 분들과 마찬가지로 많은 삽질을 했더랬습니다.

http://date4u.tistory.com/tag/Toolchain 에서 많은 참고를 했었지만 ,

중간에 몇군데 막히는 부분이 있더군요.

따라서 그부분을 추가해서 다시한번 툴체인 설치에 관한 글을 써 볼까 합니다.

(설치한지 며칠 지나서 쓰려니 벌써 기억이 안나기 시작하네요 -_ㅜ)

 

## 혹시 잘 안되는 부분이나 글에 오류가 있으면 덧글 부탁드립니다.

## 며칠전에 했던거라 잘못 쓴 부분이 있을 수도 있기 때문입니다.

 

 

 툴체인 설치과정

 

1. 맥OS X 용 SDK 다운로드

2. 아이폰/아이팟터치용 root filesystem 다운로드

3. 아이폰용 크로스컴파일러가 설치된 cygwin 다운로드 및 설치

4. cygwin에 필요한 파일들 복사 및 설치

5. Hello, world 테스트

6. 이클립스 및 이클립스 CDT 설치 및 연동

7. 이클립스에서 컴파일 하기

 

 

 

 

 

맥OS X용 SDK 다운로드

Xcode 2.5 이미지를 다운로드 합니다.

로그인 후 다운로드가 가능한데, 어짜피 가입해두시는 편이 좋을듯 합니다.

다운받은 이미지는 dmg파일인데, PowerISO라는 프로그램을 통해 가상시디롬으로 만들어서 열어야 합니다.

 

나중에 cygwin을 설치하고 나서 필요한 파일들을 복사하도록 합니다.

 

 

 

아이폰/아이팟터치용 root filesystem 다운로드

아이폰이나 아이팟 터치에서 직접 다운로드 할 수도 있으나, 잘 안된다고 하더군요.

저도 직접 인터넷에서 다운로드 해서 설치했습니다. 일단 1.4용 firmware를 다운로드 합니다.

 

다운로드 후 확장자를 zip으로 변경해 주고 압축파일을 연 다음, 022-3894-4.dmg 파일을 압축해제 합니다.

 

이 글에 첨부된 

 

파일을 다운받아서, 

022-3894-4.dmg 파일과 같은 경로에 넣어준 후,

압축을 풀고 vfdecrypte.exe 파일 및 dll 파일 2개가 생성된것을 확인합니다.

 

cmd 명령으로 쉘을 쉴행시켜서 위 경로로 갑니다. 명령창에,

vfdecrypt.exe -i 022-3894-4.dmg -o trasyia114.dmg -k d0a0c0977bd4b6350b256d6650ec9eca419b6f961f593e74b7e5b93e010b698ca6cca1fe

라고 입력 해서 이미지를 디코딩 하면 trasyia114.dmg 파일이 생깁니다.

이 파일을 나중에 cygwin 설치 후 PowerISO로 열어서 필요한 파일을 꺼내올 겁니다.

 


 

 

 

 

아이폰용 크로스컴파일러가 설치된 cygwin 다운로드 및 설치

Cygwin setup 파일을 다운로드 받아서 실행합니다.

 

아래 그림과 같이 User URL을 http://www.iphonegameover.com/cygwin 으로 입력하고 Add버튼을 눌르면 소스리스트에 위 사이트가 추가되면서 크로스 컴파일러가 설치된 cygwin 패키지가 다운로드 될 준비가 됩니다.

 


 
























 

준비가 되면 아래 그림과 같은 화면이 나오는데, default로 설치 합니다.

(가끔 이화면이 안나오고 에러가 발생하면서 setup.exe가 종료되기도 하는데 이럴때는 다른 pc에서 파일을 로컬에 다운로드하고 복사해 와서 설치해도 됩니다.)

 


 

 

 

 

 

 

cygwin에 필요한 파일들 복사 및 설치

cygwin 설치후 최초로 실행하기 전에, Xcode를 설치 합니다.

위에서 받은 Xcode이미지를 PowerISO로 열어서 아래 경로의 Archive.pax.gz파일을 찾습니다

\Packages\Packages\MacOSX10.4.Universal.Pkg\Contents\Archive.pax.gz

이 파일을 cygwin설치 디렉토리의 home/username/ 아래에 복사해 넣습니다

(c:에 설치하셨다면, c:/cygwin/home/username/ 이 되겠습니다)

 

그리고 위에서 디코딩한 root filesystem 역시 PowerISO로 열어서

/user/local/arm-apple-darwin/filesystem/ 아래에 복사해 넣습니다.

 


 

 

이제 cygwin을 실행해 보면, 자동으로 Archive.pax.gz파일을 찾았다고 나오고 설치가 진행됩니다.

설치가 완료되면 Your tool chain installation is now complete! 라는 메시지가 나오고 설치가 완료됩니다.

 

 

 

 

 

Hello, world 테스트

 이제 Hello, world를 컴파일 해 볼 시간입니다.

이 글에 첨부된 


을 다운받아 압축을 풀고 cygwin에 helloWorld.app라는 디렉토리를 만든뒤 복사해 넣습니다.

컴파일은 make 명령으로 간단히 진행됩니다.

 


 

컴파일 되었으면 실행을 해 볼 차례입니다.

제 경우는 터치밖에 가지고 있지 않으므로, Touch Explorer로 터치의 /Applications 디렉토리에 넣고 실행해 보았습니다 (Jail-break 된 터치라야 업로드가 될겁니다). Auto-permition(권한을 자동으로 설정해주는 어플, 터치 Jail-break 후에 따로 설치해야 함)으로 권한 설정을 해주시면 섬머보드가 재 실행되면서 터치 화면에 추가된 hello, world를 보실 수 있습니다. 실행하면 아래와 같은 화면이 나옵니다.

 

 


 

 

 

 

 

이클립스 및 이클립스 CDT 설치 및 연동

이제 이클립스를 설치하기 위한 준비단계 입니다.

 

먼저 윈도우의 환경변수에서 path를 수정해 줘야 합니다.

cygwin에서 env | grep PATH 명령으로 path를 확인해 보면 아래와 같은데,

/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin: 라는 부분만 복사를 해서

윈도우의 환경변수중 Path에 추가해 줍니다.

 

당연히 경로는 c:\cygwin 아래 일 것이므로

c:\cygwin\usr\local\bin;c:\cygwin\usr\bin;c:\cygwin\bin;c:\cygwin\usr\X11R6\bin

의 형태로 추가를 해주시면 됩니다.

 

include경로 추가도 해줘야 하므로

윈도우의 환경변수에 include라는 변수이름을 추가하고 변수값에는

c:\cygwin\usr\local\arm-apple-darwin\include

를 추가해 줍니다.

 

이제 이클립스 for C, C++를 다운로드 합니다.

그리고 이클립스 CDT도 다운로드 합니다.

 

먼저 이클립스를 설치 한 후, 실행 합니다.

아래 그림처럼 Help > Software updates > Find and install 을 실행합니다

 


 

 

 

여기서 Search for new features to install을 선택하고

New Archived Site... 로 들어가서 아까 다운로드한 CDT zip파일을 선택한 후 설치합니다.

 


 

 

 

이제 자잘한 설정이 남았습니다.

 

이클립스를 닫은뒤 재실행 하시고, Window > Preference... 로 가셔서

C/C++ > NewCDT project wizard > Makefile Project 로 가셔서

아래 그림처럼 Elf Parser, Cygwin PE Parser, GNU ELF Parser 를 체크해 줍니다.

(만약 New CDT project wizard 항목이 없다면 CDT설치가 잘못된것입니다.)

 

그리고 Error Parsers 탭에서 모두 선택합니다.

 


 

 


 

 

 

자 이제 준비가 거의 끝났습니다.

다른 포스트에서 본 경우에는 이후 정상적으로 컴파일이 되었다고 하는데, 제 경우엔 잘 되지 않아서 이리저리 고민하다 알아낸 것이 추가적인 이클립스 내의 경로 설정입니다.

(혹시 컴파일 할때 Exec error: Launching failed 라는 메시지가 뜨신다면 이 방법으로 해결이 될겁니다)

 

Window > Preference... 로 가셔서 C, C++ > Environment로 갑니다.

New를 선택하고 Name에 PATH를 Value 에 윈도우의 환경변수 Path와 같은 내용을 써 줍니다.

 


 

 

 

 

 

 

이클립스에서 컴파일 하기

File > New... > C project 로 가서 새 프로젝트를 생성합니다.

모두 default로 합니다.

 


 

 

 

아까 cygwin에서 썼던 hello, World 소스를 import 합니다.

프로젝트 이름 우클릭 > import

 


 

 

 

General에서 file system을 고른후 hellow, Wolrd 파일들을 압축 풀어둔 디렉토리를 선택하면

아래처럼 파일들을 골라서 import할 수 있습니다.

 


 


 

 

이제 컴파일을 해 봅니다.

 

Project > Clean... 으로 컴파일을 하시면 아래와 같이 나와야 정상적으로 컴파일이 된 것입니다.

수고하셨습니다.

 


 

 

 

길고긴 포스팅이 드디어 끝이났네요.

다음 포스팅이 언제가 될지는 저도 모릅니다. 배워가면서 하는입장이라서요 ^^.

그럼 즐거운 개발들 되시기 바랍니다.


Domain Controller

For the remainder of this chapter the focus is on the configuration of domain control. The examples that follow are for two implementation strategies. Remember, our objective is to create a simple but working solution. The remainder of this book should help to highlight opportunity for greater functionality and the complexity that goes with it.

A domain controller configuration can be achieved with a simple configuration using the new tdbsam password backend. This type of configuration is good for small offices, but has limited scalability (cannot be replicated), and performance can be expected to fall as the size and complexity of the domain increases.

The use of tdbsam is best limited to sites that do not need more than a Primary Domain Controller (PDC). As the size of a domain grows the need for additional domain controllers becomes apparent. Do not attempt to under-resource a Microsoft Windows network environment; domain controllers provide essential authentication services. The following are symptoms of an under-resourced domain control environment:

  • Domain logons intermittently fail.

  • File access on a domain member server intermittently fails, giving a permission denied error message.

A more scalable domain control authentication backend option might use Microsoft Active Directory or an LDAP-based backend. Samba-3 provides for both options as a domain member server. As a PDC, Samba-3 is not able to provide an exact alternative to the functionality that is available with Active Directory. Samba-3 can provide a scalable LDAP-based PDC/BDC solution.

The tdbsam authentication backend provides no facility to replicate the contents of the database, except by external means (i.e., there is no self-contained protocol in Samba-3 for Security Account Manager database [SAM] replication).

Note

If you need more than one domain controller, do not use a tdbsam authentication backend.

Example: Engineering Office

The engineering office network server we present here is designed to demonstrate use of the new tdbsam password backend. The tdbsam facility is new to Samba-3. It is designed to provide many user and machine account controls that are possible with Microsoft Windows NT4. It is safe to use this in smaller networks.

Example 2.7. Engineering Office smb.conf (globals)


[global]
workgroup = MIDEARTH
netbios name = FRODO
passdb backend = tdbsam
printcap name = cups
add user script = /usr/sbin/useradd -m %u
delete user script = /usr/sbin/userdel -r %u
add group script = /usr/sbin/groupadd %g
delete group script = /usr/sbin/groupdel %g
add user to group script = /usr/sbin/groupmod -A %u %g
delete user from group script = /usr/sbin/groupmod -R %u %g
add machine script = /usr/sbin/useradd -s /bin/false -d /var/lib/nobody %u
# Note: The following specifies the default logon script.
# Per user logon scripts can be specified in the user account using pdbedit
logon script = scripts\logon.bat
# This sets the default profile path. Set per user paths with pdbedit
logon path = \\%L\Profiles\%U
logon drive = H:
logon home = \\%L\%U
domain logons = Yes
os level = 35
preferred master = Yes
domain master = Yes
idmap uid = 15000-20000
idmap gid = 15000-20000
printing = cups

Example 2.8. Engineering Office smb.conf (shares and services)


[homes]
comment = Home Directories
valid users = %S
read only = No
browseable = No
# Printing auto-share (makes printers available thru CUPS)

[printers]
comment = All Printers
path = /var/spool/samba
printer admin = root, maryo
create mask = 0600
guest ok = Yes
printable = Yes
browseable = No

[print$]
comment = Printer Drivers Share
path = /var/lib/samba/drivers
write list = maryo, root
printer admin = maryo, root
# Needed to support domain logons

[netlogon]
comment = Network Logon Service
path = /var/lib/samba/netlogon
admin users = root, maryo
guest ok = Yes
browseable = No
# For profiles to work, create a user directory under the path
# shown. i.e., mkdir -p /var/lib/samba/profiles/maryo

[Profiles]
comment = Roaming Profile Share
path = /var/lib/samba/profiles
read only = No
profile acls = Yes
# Other resource (share/printer) definitions would follow below.

  1. A working PDC configuration using the tdbsam password backend can be found in Engineering Office smb.conf (globals) together with Engineering Office smb.conf (shares and services):

  2. Create UNIX group accounts as needed using a suitable operating system tool:

    root# groupadd ntadmins
    root# groupadd designers
    root# groupadd engineers
    root# groupadd qateam
  3. Create user accounts on the system using the appropriate tool provided with the operating system. Make sure all user home directories are created also. Add users to groups as required for access control on files, directories, printers, and as required for use in the Samba environment.

  4. Assign each of the UNIX groups to NT groups by executing this shell script (You could name the script initGroups.sh):

    #!/bin/bash
    #### Keep this as a shell script for future re-use

    # First assign well known groups
    net groupmap add ntgroup="Domain Admins" unixgroup=ntadmins rid=512 type=d
    net groupmap add ntgroup="Domain Users" unixgroup=users rid=513 type=
    net groupmap add ntgroup="Domain Guests" unixgroup=nobody rid=514 type=d

    # Now for our added Domain Groups
    net groupmap add ntgroup="Designers" unixgroup=designers type=d
    net groupmap add ntgroup="Engineers" unixgroup=engineers type=d
    net groupmap add ntgroup="QA Team" unixgroup=qateam type=d
  5. Create the scripts directory for use in the [NETLOGON] share:

    root# mkdir -p /var/lib/samba/netlogon/scripts

    Place the logon scripts that will be used (batch or cmd scripts) in this directory.

The above configuration provides a functional PDC system to which must be added file shares and printers as required.

'리눅스 서버에 대해서 > 리눅스 팁들' 카테고리의 다른 글

쉘 프로그래밍 강좌  (0) 2013.01.10
GNU Make 강좌  (0) 2013.01.07
이클립스에서 C++ 환경 만들기  (0) 2012.12.10
make 강좌  (0) 2010.07.04
vi(Visual) Editor 사용법  (0) 2008.06.15
신입 개발자를 위한 조언
효율적으로 MSDN을 보는 방법
신영진 codewiz@gmail.com http://www.jiniya.net

윈도우 개발자를 위한 가장 기초적인, 동시에 가장 방대한 레퍼런스가 있다면 바로 MSDN일 것이다. 상당수의 고급 개발자들은 MSDN만 주어진다면 거의 모든 정보를 다 얻을 수 있다고 말하기도 한다. 하지만 아직도 초보 개발자들은 MSDN은 설치해두었지만 그 속에서 정보를 얻고 있지는 못하다. 게시판에 올린 질문에 냉소적으로 올라오는 MSDN을 참고하라는 말에 상처를 받기도 한다. 왜냐하면 정작 본인은 MSDN을 보았으나 정보를 얻지 못했기 때문이다. 이 글에서는 이러한 MSDN을 효율적으로 보는 방법에 대해서 다룰 것이다. 각 함수에 대한 정보를 보고 이해하는 방법에서부터 방대한 MSDN에서 자신이 원하는 정보를 찾기 위한 방법까지 언급할 것이다. 물론 이 과정에서 기본적인 영어 독해 실력은 필수사항이다.

MSDN에서 얻을 수 있는 가장 기초적인 정보는 개별 윈도우 API의 사용방법이다. 여러분이 OpenProcess의 정보를 얻고 싶다면 MSDN을 켜고 색인에서 OpenProcess를 입력하면 된다. 하지만 고민은 이 과정부터 시작된다. 검색된 OpenProcess가 너무 많기 때문이다. 일반적으로 PC에 설치되는 윈도우 운영체제에서 사용되는 OpenProcess 정보를 보고 싶다면 옆에 base라고 붙은 것을 클릭하면 된다.

이렇게 정보를 찾아 왔다면 MSDN은 여러분에게 OpenProcess에 대한 모든 정보를 보여줄 것이다. MSDN의 함수 설명은 총 여섯 개의 카테고리로 이루어진다. 인자 정보(Parameters), 리턴 값(Return Values), 주의 사항(Remarks), 예제 코드(Example Code), 요구 사항(Requirements), 관련 함수(See Also)가 그것이다.  

인자 정보에서 여러분이 이해해야 할 가장 큰 정보는 각 인자의 종류다. 종류는 크게 입력(in), 출력(out), 입출력(in, out)으로 나뉜다. 입력 정보의 대표적인 형태는 OpenProcess의 첫 번째 인자와 같은 것이다. OpenProcess의 첫 번째 인자는 열고자하는 프로세스 핸들의 권한을 설정하는 값으로 설명에 있는 process access rights라고 된 부분을 클릭해서 나오는 정보를 조합해서 넘기면 된다. 출력 정보의 대표적인 형태는 GetWindowText 함수에서 찾을 수 있다. GetWindowText의 두 번째 인자는 윈도우 캡션명을 저장할 문자열 포인터다. 이 공간은 출력용 포인터로 세 번째 인자인(nMaxCount)를 저장할 수 있을 만큼의 공간을 가진 버퍼를 넘겨야 한다. 끝으로 입출력 정보의 대표적인 형태는 GetVersionEx 함수에서 찾을 수 있다. GetVersionEx 함수의 유일한 인자인 lpVersionInfo는 넘기기 전에 dwOSVersionInfoSize에 구조체 크기를 지정해 주어야 한다. 이 후 함수를 호출하면 GetVersionEx 함수는 윈도우 버전 정보를 lpVersionInfo에 담아준다.

리턴 값에서 인지해야 할 가장 중요한 두 가지 정보는 성공한 경우의 리턴 값과 실패한 경우의 리턴 값이다. 또한 실패한 경우에 추가적으로 실패한 원인을 찾을 수 있는 방법에 대해서도 알아두어야 한다. 대부분의 윈도우 API의 경우 GetVersionEx 함수와 같이 성공한 경우에 0이 아닌 값을, 실패한 경우에 0을 반환한다. 또한 실패한 경우에는 추가적인 실패 원인을 GetLastError를 통해서 조회할 수 있다. 종종 GetCurrentProcess와 같이 절대 실패하지 않는 함수들도 있다. 동시에 실패하지만 MSDN에는 실패에 대한 언급이 없는 GetWindowThreadProcessId와 같은 함수도 있다. GetWindowThreadPorcessId 함수는 잘못된 윈도우 핸들이 전달되면 실패하며, 실패여부는 GetLastError를 통해서 알 수 있다.

끝으로 각 함수에 첨부되어 있는 요구 사항 표를 살펴보는 방법에 대해서 알아보자. 요구 사항 표에는 각 함수를 호출할 수 있는 운영체제가 나와 있다. 여기서는 여러분의 제품이 지원하는 운영체제의 하한선이 존재하는 가만 확인하면 된다. Windows 98을 지원해야 하는 제품이라면 VerifyVersion 함수를 정적으로 사용하는 것은 피해야 한다. 이 함수는 Windows 2000 이상부터 사용가능하기 때문이다. 굳이 이 함수를 사용해야 한다면 GetProcAddress로 동적으로 함수 주소를 구해서 사용하는 방법을 택해야 한다.

이제 한 함수의 정보를 알아내는 방법에 대해서 살펴보았다. 하지만 망망대해 같은 MSDN을 탐색하는데에는 이런 방법으로는 한계가 있다. 좀더 효과적으로 다양한 정보를 한번에 살펴볼 수 있는 방법이 필요한 것이다. 이런 방법 중에 하나가 마법과 같은 버튼인 목차 동기화(Sync Contents) 버튼에 있다. OpenProcess 설명 부분에서 이 버튼을 눌러 보자. 그러면 OpenPorcess 설명이 있는 목차로 이동하게 된다. 여기서 여러 분들은 세 가지 중요한 사항을 인지해야 한다. 하나는 OpenProcess가 있는 목차의 위치다. 두 번째는 OpenProcess와 같은 단계에있는 다른 함수들에 대한 정보다. 마지막 정보는 OpenProcess 목차 부위에 있는 기술 문서(Technical Article)이다.

+ Recent posts