自身のブログからの転載。
結論から言うと、
あるライブラリはスタティックリンク、あるライブラリはダイナミックリンクしたいという場合
gccの-staticオプションは全体に効いちゃうから
以下のようにリンカに直接オプションを渡すといいよ。という話。
gcc … -Wl,-lmigemo,-lonig,-dn,-llua …
(migemo, onigrumaはダイナミック、luaはスタティック)
※『みたい』、『ようです』の憶測が多いのは
ちゃんとドキュメント見てなくて、実験的に調べた結果のため。
libhoge.aを探すかlibhoge.dll.aを探すか
hogeというライブラリをダイナミックリンクする場合コンパイラ(リンカ)は
libhoge.dll.a → libhoge.aの順にインポートライブラリを探してくれますが、
スタティックリンクの場合は
libhoge.a
しか探しに行かないようです。
したがって、明示的にダイナミックリンクするライブラリならlib~.dll.aという名前を、
それ以外はlib~.aという名前を、両方あり得るなら二つとも用意すればいいわけです。
スタティックリンクを指定するオプション-static
さて、ライブラリのスタティックリンク/ダイナミックリンクを指定するオプションとして
gccには-staticというオプションがあるんですが、
これは-l<ライブラリ名>で与えられたライブラリ全体に効いてくるみたいです。
ですので、
gcc … -lmigemo -llua -static -lonig
としたら、onigrumaだけスタティックリンクにして欲しいところですが...
migemo, luaもスタティックリンクしようとしてlibmigemo.a, liblua.aだけ探しに行きます。
libmigemo.dll.aやliblua.dll.aしかない場合はスタティック用リンクライブラリが見つからず
-lmigemo(-llua)は無効だよ!ってことでコンパイルエラーになってしまいます。
リンカに直接オプションを渡そう
それに対して記事冒頭のようにリンカに直接オプションを渡した場合は
-dn(-Bstatic)オプションより前のライブラリはダイナミックリンク、
オプションより後ろのライブラリはスタティックリンクとして扱ってくれるみたいです。
多分デフォルトがダイナミックリンクなのでしょう。
ちなみに
gcc … -Wl,-dy,-lmigemo,-dn,-lonig,-dy,-llua …
このようなダイナミック(-dy)とスタティック(-dn)を混ぜた指定も可能です。