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を参照して以下のようになる。
Shell | Makefile | GitHub 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を作成して文字コード変換
※本記事内容の無断転載を禁じます。
ご連絡は以下アドレスまでお願いします★
Windowsのデスクトップ画面をそのまま配信するための下準備
WindowsでGPUの状態を確認するには(ASUS系監視ソフトの自動起動を停止する)
CORESERVER v1プランからさくらインターネットスタンダートプランへ引っ越しメモ
さくらインターネットでPython MecabをCGIから使う
さくらインターネットのPHPでAnalytics-G4 APIを使う
インクルードパスの調べ方
【Git】特定ファイルを除外する.gitignore
【Ubuntu/Debian】NVIDIA関係のドライバを自動アップデートさせない
【Python】Spacyを使用して文章から出発地と目的地を抜き出す
【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法
Windows11+WSL2でUbuntuを使う【2】ブリッジ接続+固定IPの設定
Windows版Google Driveが使用中と言われアンインストールできない場合
VirtualBoxの仮想マシンをWindows起動時に自動起動し終了時に自動サスペンドする
【Apache】サーバーに同時接続可能なクライアント数を調整する
【C/C++】小数点以下の切り捨て・切り上げ・四捨五入
Googleファミリーリンクで子供の端末の現在地がエラーで取得できない場合
【Linux】iconv/libiconvをソースコードからインストール
Ubuntu Server 21.10でイーサリアムブロックチェーン【その5】