C/C++ライブラリを作るためのMakefile
C/C++の自分用のライブラリを作るためのMakefileの例です。
下記のページなどを参考にしました(ほぼそのまま使わせていただきました)。
静的ライブラリの場合
ライブラリ名をlibmylib.a、ライブラリに入れたいソースコードがtest1.cpp, test2.cppの場合。
TARGET = libmylib.a
SRCS = test1.cpp test2.cpp
OBJS = $(SRCS:.cpp=.o)
CC = g++
CFLAGS = -std=c++17 -Wall -O3
$(TARGET) : $(OBJS)
ar rc $(TARGET) $(OBJS)
ranlib $(TARGET)
all: $(TARGET)
.cpp.o:
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
動的ライブラリの場合
ライブラリ名をlibmylib.so、ライブラリに入れたいソースコードがtest1.cpp, test2.cppの場合。
TARGET = libmylib.so
SRCS = test1.cpp test2.cpp
OBJS = $(SRCS:.cpp=.o)
CC = g++
CFLAGS = -shared -fPIC \
-std=c++17 -Wall -O3
$(TARGET) : $(OBJS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)
all: $(TARGET)
.cpp.o:
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
作成したライブラリを使ったプログラムのコンパイル
プログラムがmain.cppの場合。
% g++ -o main main.cpp -L./ -lmylib
libmylib.aとlibmylib.soの両方があった場合、動的ライブラリが優先されてリンクされます。動的ライブラリがリンクされているかどうかは、コンパイルされた実行ファイルをlddで見ると分かります。
% ldd main
動的ライブラリがリンクされている場合は、実行時にパスを通しておく必要があります。
/etc/ld.so.confにlibmylib.soのあるディレクトリのパスを書き込むか、
スーパーユーザになれない場合は環境変数 LD_LIBRARY_PATHに設定すれば良いでしょう。
/etc/ld.so.confに書き込んだ場合はldconfigをsudoすれば反映されます(リブートでもOK)。
% sudo /sbin/ldconfig