2024-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を作成して文字コード変換
※本記事内容の無断転載を禁じます。
ご連絡は以下アドレスまでお願いします★
オープンソースリップシンクエンジンSadTalkerをDebianで動かす
ファイアウォール内部のOpenAPI/FastAPIのdocsを外部からProxyPassで呼ぶ
Debian 12でsshからshutdown -h nowしても電源が切れない場合
【Windows&Mac】アプリのフルスクリーンを解除する方法
Debian 12でtsコマンドが見つからないcommand not found
Debian 12でsyslogやauth.logが出力されない場合
Debian 12で固定IPアドレスを使う設定をする
Debian 12 bookwormでNVIDIA RTX4060Ti-OC16GBを動かす
【Debian】apt updateでCD-ROMがどうのこうの言われエラーになる場合
【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法
Windows11+WSL2でUbuntuを使う【2】ブリッジ接続+固定IPの設定
【Apache】サーバーに同時接続可能なクライアント数を調整する
GitLabにHTTPS経由でリポジトリをクローン&読み書きを行う
【C/C++】小数点以下の切り捨て・切り上げ・四捨五入
Intel Macbook2020にBootCampで入れたWindows11 Pro 23H2のBluetoothを復活させる
【PHP】Mail/mimeDecodeを使ってメールの中身を解析(準備編)
【ひかり電話+VoIPアダプタ】LANしか通ってない環境でアナログ電話とFAXを使う
Windows11のコマンドプロンプトでテキストをコピーする