リンカ・ローダと実行形式
GNUのリンカで「gcc -lmylib main.o」のように、静的ライブラリをそれを使うオブジェクトファイルより前に書くと、未定義の参照のエラーになることがある。その理由として正しいものはどれか。
- Aリンカは左から順に処理し、ライブラリを読む時点でまだ参照されていない関数は取り出さないから
- Bライブラリは必ずコマンドの最後に1つしか書けない決まりだから
- Cライブラリを前に書くと、ライブラリの中身が消去されるから
答えと解説を見る
正解:A. リンカは左から順に処理し、ライブラリを読む時点でまだ参照されていない関数は取り出さないから
GNUのリンカは、コマンドラインに書かれた順にファイルを処理し、静的ライブラリに出会った時点で「まだ定義が見つかっていない参照」を解決するオブジェクトだけを取り出します。ライブラリを先に書くと、その時点ではmain.oの参照がまだないので何も取り出されず、後からmain.oを読んでも戻って探しません。そのため、ライブラリは使う側の後ろに書くのが原則です。
- A. 正しい。順番に意味があります。
- B. ライブラリは複数書けます。
- C. ライブラリの中身が消えることはありません。