2017年4月20日木曜日

自作ライブラリをCMakeでディレクトリごとインストールする方法

自作ライブラリをCMakeでディレクトリごとインストールする方法

春先は送迎会などで諭吉が吹き飛んでいくのが悲しい限りです. ああ,諭吉よ.どうしてあなたは行ってしまったのですか. それはさておき, githubとかで自作ライブラリを公開するときに CMakeつかってビルドして/usr/local/lib/にインストールする方法を紹介しますね.

まず,今回はSonyの開発した人類の永遠の友であるPS3のコントローラーをlinuxで簡単に使用できるライブラリを作ったので,それをドヤ顔してgithubに公開してやろうかと思ったところ,opencvとかのように

sudo make install

とかやると, /usr/local/inculde/と /usr/local/lib/ にいい感じにインストールされる方法がわからなかったときのメモであぞよ.

というわけで,どうすればいいかお教えしましょう. まず,本日の生け贄... 本日のメインディッシュはdualshockという名前のライブラリとなっております.

構成

本日の構成は

dualshock
   |-CMakeLists.txt
   |-READEME.md
   |-example--testDs3.cpp
   |-include--dualshock--ds3.cpp
   |-src--ds3.cpp

となっております.というか,こんな感じのディレクトリ構成にしてください.多少は意味があります.

CMakeLists.txt

CMakeLists.txtは以下のように記述すること.

cmake_minimum_required(VERSION 3.5)
 
project(dualshock)
 
add_definitions("-std=c++11")
 
set(SRC_DIR src)
set(INCLUDE_DIR include/dualshock)
 
include_directories(${INCLUDE_DIR})
 
add_library(dualshock STATIC ${SRC_DIR}/ds3.cpp)
target_link_libraries(dualshock pthread)
 
install( TARGETS dualshock
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
    )
 
install(DIRECTORY include/dualshock
    DESTINATION /usr/local/include
    )

ポイント

この場合,ファイル構成は綺麗になるが,ヘッダーと実装ファイルの 関係をどのように定義するのかが問題となる.

コンパイル時と,インストール後に使用するときとでは, それらの関係が異なるのである.

具体的には,cppファイルでどのようにヘッダーをincludeするのかということである.

でも,よく考えると,ヘッダーのincludeはコンパイルの時にのみ必要になる.ということは,インストールするときさえ乗り切れば,あとは,どうとでもなる.ということ.よって,ds3.cppのinclude部分をちょっとかえる.

FROM

#include "ds3.hpp"

ライブラリ内のヘッダーを参照するようにincludeのパスを変更する.

TO

#include "../include/dualshock/ds3.hpp"

結果

これを実行すると /usr/local/include 以下に /dualshock/ds3.hpp

/usr/local/lib/ 以下に libdualshock.a

がインストールされる.