アプリケーション開発ポータルサイト
ServerNote.NET
カテゴリー【C/C++
C言語用JSONライブラリparsonをlibparson.so/aとしてビルド・インストール
POSTED BY
2023-08-29

C言語用JSONパーサー/シリアライザとして定番のparsonであるが、以前libnkfでやったようにライブラリとしてビルド・インストールするMakefileを作成する。

parsonのクローン

git clone https://github.com/kgabis/parson.git

libparsonディレクトリとMakefileの作成

チェックアウトしたparsonディレクトリと同じ階層に作成して../parson/parson.c,hを参照する形とする。
HOME
--parsonディレクトリ
--libparsonディレクトリ/Makefile(libparson.a,soをビルド)

mkdir libparson
cd libparson
vi Makefile

Makefileは../parson/parson.c,hを参照して以下のようになる。

ShellMakefileGitHub Source
CC    =  gcc
#CC_DBG  +=  -g
CC_OPT  +=
CC_INC  +=
CFLAGS  +=  $(CC_OPT) $(CC_DBG) $(CC_INC)
DESTLIB  =  /usr/local/lib
DESTINC  =  /usr/local/include

all:  libparson.a libparson.so.1.0

libparson.oa:  ../parson/parson.c ../parson/parson.h
  $(CC) $(CFLAGS) -o $@ -c $<

libparson.os:  ../parson/parson.c ../parson/parson.h
  $(CC) $(CFLAGS) -fPIC -o $@ -c $<

libparson.a:  libparson.oa
  ar rv $@ $?
  ranlib $@

libparson.so.1.0:  libparson.os
  $(CC) -shared -Wl,-soname,libparson.so.1 -o libparson.so.1.0 $?

clean:
  rm -f *.o* *.a *.so*

install:  all
  install libparson.a $(DESTLIB)
  install libparson.so.1.0 $(DESTLIB)
  ldconfig $(DESTLIB)
  ln -f -s -r $(DESTLIB)/libparson.so.1 $(DESTLIB)/libparson.so
  install -m 0644 ../parson/parson.h $(DESTINC)

gccコンパイルオプションの異なるスタティックとシェアードを同時に作るのでオブジェクトファイルも.oでなく.oa、.osなどと分ける必要がある。
シェアードライブラリをビルドする場合-shared -Wl,-soname,libxxx.so.1とするのはgccの固定ルールである。

ビルド・インストール

make

gcc    -o libparson.oa -c ../parson/parson.c
ar rv libparson.a libparson.oa
ar: libparson.a を作成しています
a - libparson.oa
ranlib libparson.a
gcc    -fPIC -o libparson.os -c ../parson/parson.c
gcc -shared -Wl,-soname,libparson.so.1 -o libparson.so.1.0 libparson.os

sudo make install

install libparson.a /usr/local/lib
install libparson.so.1.0 /usr/local/lib
ldconfig /usr/local/lib
ln -f -s /usr/local/lib/libparson.so.1 /usr/local/lib/libparson.so
install -m 0644 ../parson/parson.h /usr/local/include

/usr/local/include/parson.h、/usr/local/lib/libparson.aが入り、さらにシェアードライブラリlibparson.so.1.0をコピー後ldconfigによりlibparson.so.1が生成されるのでlibparson.soとしてリンクが貼られて完了。

これでプログラムからは他の一般ライブラリのように使える。gitリポジトリparsonにあるtests.cをコンパイルしてみる。

cd ../parson
gcc -o tests.x -I/usr/local/include -L/usr/local/lib tests.c -lparson

などとビルドできるし、Apacheのモジュールなどから動的にロードできる。

LoadFile /usr/local/lib/libparson.so

目的ライブラリをリンクしているかは以下コマンドで確認できる。

ldd tests.x
        linux-vdso.so.1 (0x00007ffc698c8000)
        libparson.so.1 => /usr/local/lib/libparson.so.1 (0x00007f0d786b9000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0d7831a000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f0d78ad5000)

【関連】C言語用最新NKFライブラリlibnkf-2.1.5を作成して文字コード変換

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

【キーワード検索】