アプリケーション開発ポータルサイト
ServerNote.NET
Amazon.co.jpでPC関連商品タイムセール開催中!
カテゴリー【C/C++
【gcc】-lオプションで一部のライブラリのみスタティックリンクする
POSTED BY
2023-08-30
/usr/local/libに以下のようにライブラリがインストールされているとして、

libnkf.a
libnkf.so
libpq.a
libpq.so

libnkf,libpqを使うプログラムをコンパイルするには普通は以下のようにする。

gcc test.c -I/usr/local/include -L/usr/local/lib -lnkf -lpq

-lオプションを使うわけだが、何も指定しないとデフォルトではダイナミックリンクライブラリlibnkf.so,libpq.soが採用され、実行時にLD_LIBRARY_PATHでロードする必要がある。
lddコマンドでダイナミックリンクされているのが確認できる。

ldd a.out
libnkf.so.1 => /usr/local/lib/libnkf.so.1 (0x00007f2f44bb3000)
libpq.so.5 => /usr/local/lib/libpq.so.5 (0x00007f2f44982000)

これをダイナミックでなくスタティックライブラリの.aをリンクしたい場合、以下のようにコンパイルする。

gcc test.c -I/usr/local/include -L/usr/local/lib -Wl,-Bstatic,-lnkf,-lpq,-Bdynamic

最後に-Bdynamicをつけて終わらないと、システムデフォルトのライブラリもスタティックリンクを試みられ結果リンクエラーになるので必ずつける。
同じようにlddコマンドで、今度はlibnkf.so,libpq.soが出現していないはずである。

また、libnkfはスタティック、libpqはダイナミックというようなリンクをするなら以下のようにする。

gcc test.c -I/usr/local/include -L/usr/local/lib -Wl,-Bstatic,-lnkf,-Bdynamic,-lpq

-Bstaticはこの後続くライブラリはスタティック、-Bdynamicはこの後続くライブラリはダイナミックという指定なので、-Bdynamicで終わっておけばシステムライブラリも正しくリンクされる。

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

☆ServerNote.NETショッピング↓
ShoppingNote / Amazon.co.jp
☆お仲間ブログ↓
一人社長の不動産業務日誌
【キーワード検索】