Xcode4の使い方メモ 〜 コマンドラインアプリ & コンパイルオプションなど

いろいろ触ってみた順にメモしています。
前回と若干重複していますが、C++コマンドラインアプリを作成する手順です。

ワークスペース作成

File>New>New Workspaceで適当な場所にワークスペースを作成します。
ワークスペースには複数のプロジェクトを追加することができます。

プロジェクト作成

File>New>New Projectでプロジェクト名"sample"とパス指定して追加(TypeはC++を選択しておく)
するとデフォルトでは以下のような構成になっています。
//sample.xcodeproj
//sample/main.cpp
プロジェクトファイル(.xcodeproj)が存在するパスをとします。

ソースファイルの追加

File>New>New File, 追加したいファイルとパスを選択して"Add"
例えばデフォルトのパスにヘッダ"Sample.h"を追加してみます。→//sample/Sample.h

ソースファイルの削除

削除したいファイルを選択してdelete, ファイルを残したいのでRemove Reference Onlyを選択、完全に消す場合はdelete

Finderからソースファイルを追加する

Navigatorにドラッグドロップ>create groups for any added folfers, Add to Targetsにチェックを入れる>"Finish"

インクルードパスの追加

準備

プロジェクトを最初の状態にもどします。
例えば"Sample.h"を先ほどと別のディレクトリに作成してみます。→//include/Sample.h
さらにmain.cppでこのヘッダをインクルードさせておきます。

#include "Sample.h"
#include <iostream>
int main (int argc, const char * argv[]){
    std::cout << "hello" << std::endl;
    return 0;
}

ここでビルドすると、インクルードパスが指定されていなくてビルドが通りません。

Lexical or Preprocessor issue
"Sample.h" not found
Search Paths設定

TARGETS>ターゲットを選択"sample">Build Settings>Search Paths>Header Search Paths
縦列の各項目で設定が反映されるレベルを調整できます。
左から、Resolved,ターゲット名"sample", プロジェクト名"sample", MacOSDefault
今回はターゲットごとに指定したいので, ターゲット名の項目をクリック>"+">
ここにインクルードパス"./include"を指定する(相対パスを入れる場合は/が基準になる)
"include"内を再起的に検索する場合はRecursiveにチェックを入れる>"Done"
以上で正常にビルドができます。

実行ファイル

実行ファイル(Unix Executable File)はデフォルトで以下の場所に作成されています。
/Users//Library/Developer/Xcode/DerivedData/sample-?????/Build/Products/Debug
デフォルトではReleaseは作成されていないので手動で設定します

Releaseビルド設定

PROJECT>"sample">Build Settings>Build Archive Archtecture Only>Release
プロジェクト名"sample"の項目を"Yes"に変更
ビルドすると/Users//Library/Developer/Xcode/DerivedData/sample-?????/Build/Products/Release
内に実行ファイルが作成されていることが確認できます。
ここで一旦Cleanしておきます。

実行ファイルの出力先変更

Xcodeレベルで設定する場合は、
Xcode>Preferences>Locations>Derived Data>Relative>"出力先フォルダ名"
でプロジェクトからの相対パスで出力先を指定することができます
実際の出力先は、//DerivedData/sample/Build/Products/DebugまたはReleaseになります。
()プロジェクトごとに設定するならFile>Project Settings>Build>Derived Data>Project Relativeなどで変更できます。

gccオプション追加

TARGETS>Build Settings>Other C++ Flags で直接コンパイルオプションを指定することができます。
例えばユーザー定義プリプロセッサをオプションに指定してみます。

自前プリプロセッサの追加

TARGETS>Build Settings>Other C++ Flags>"+">"-DTARGET_LINUX"
試しにmain.cppを以下のように修正してビルドしてみます。

int main (int argc, const char * argv[]){
    std::cout << "common" << std::endl;
#ifdef TARGET_LINUX
    std::cout << "linux only" << std::endl;
#endif
    return 0;
}

コンソールに2行とも出力されれば成功です。

common
linux only