見出し画像

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

いいなと思ったら応援しよう!