(2015年3月24日更新)

コンパイル

make

Makefileがない状態で

$ make filename

と打つと

$ cc -02 -fno-strict-aliasing -pipe filename.c -o filename

が実行される(細かい所は違うかも)。

LDFLAGS

linker flags, e.g. -L if you have libraries in a nonstandard directory

コンパイルするときに使われる環境変数で、ライブラリが特殊なディレクトリにあるときに指定。

LDFLAGS="-L$HOME/local/lib"

など。

CPPFLAGS

(Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory

コンパイルするときに使われる環境変数で、ヘッダーファイルが特殊なディレクトリにあるときに指定。

CPPFLAGS="-I$HOME/local/include"

など。

LD_RUN_PATH

コンパイル時に共有ライブラリの検索パスを埋め込む

LD_LIBRARY_PATH

実行時に共有ライブラリの検索パスを指定するための環境変数。

ldd

$ ldd <実行ファイル>

で使っている共有ライブラリを確認できる。

Cannot Open Shared Object Fileの対処法

C/C++の実行ファイルの実行時にshared object(UNIX系OSの共有ライブラリ)が見つからない時に出るエラー。

$ ldd <実行ファイル>

で、見つからないライブラリに対してはnot foundと表示される。

対処法1 ライブラリの検索パスを実行ファイルに埋め込む

自分で、コンパイルし直せる状況なら、コンパイル時に適切にオプションを与えてコンパイルし直す。

例えば、

LDFLAGS = -L<dir>/lib

と設定して、<dir>/libがライブラリの検索パスに含まれない場合は実行時にnot foundになってしまう。

そこで、ライブラリの検索範囲を-Rもしくは-rpathで指定して実行ファイルに埋め込んでやる。

$ LDFLAGS = -L<dir>/lib -Wl,-R<dir>/lib

-Wlのあとにオプションをカンマ区切りで渡す。

-rpathが使えない時は環境変数LD_RUN_PATHに追加してコンパイルする?

参考

対処法2 システムのライブラリの検索パスを追加する

共有ライブラリを検索するディレクトリは通常/lib, /usr/lib/etc/ld.so.conf, /etc/ld.so.conf.d/*のファイル内で指定されたディレクトリなので、

/etc/ld.so.conf.d/<command>.confなどのファイルを作って、そこに

<dir>/lib

などとパスを追加して

$ ldconfig

/etc/ld.so.cacheを更新。

$ ldconfig -p

でライブラリが認識されていることを確認する。

参考

対処法3 環境変数を設定する

$ export LD_LIBRARY_PATH=<dir>:$LD_LIBRARY_PATH

のように追加して実行する、もしくは実行時に追加する。

LD_LIBRARY_PATH=<dir>:$LD_LIBRARY_PATH <実行ファイル>

フォーマット指定子

フォーマット指定子一覧

scanf

scanfで文字を読み込みたいときは注意が必要である。例えば c scanf(&#8220;%d&#8221;, > &i); scanf(&#8220;%c&#8221;, &ch); printf(&#8220;%d&#8221;, (int)ch);

とやると、10と表示される。これはASCII文字コードを見ると、NL(LF)で、つまりchには改行が入っていることになる。上のiの入力のときに押したEnterだ。これを避けるためには

scanf(&#8220;%d&#8221;, &i); scanf(&#8220;%&#42;c%c&#8221;, &ch);

とする。%*cは一文字無視するという意味だ。

**argv

・[mainの引数 argv

の構造]9

ポインタ

Emacs

Emacsの設定はこちら