SlideShare une entreprise Scribd logo
1  sur  6
Télécharger pour lire hors ligne
Rcpp を使って動的もしくは共有ライブラリ
(dylib, so ファイル) を用いた関数(パッ
ケージ)を作る
S.M.
October 26, 2013
Rcpp with Rstudio でビルドする際に、自作でもなんでもよい
が, 共有ライブラリをリンクさせる方法. コンパイルオプション
をどこで指定したらよいかが分からなかったのでまとめておく.
ちなみに, パッケージでなく関数単位で簡易にやりたいと当初思っ
たが, どうもパッケージを作るのが簡易な方法のようである.
動作確認環境は, Rstudio 0.97.248, Rcpp 0.10.5

libhelloworld.dylib と helloworld.h を用意しておく.
内容は察して下さい.

1
[取りあえずやってみる]
1. RStudio の Package with Rcpp を作成
2. llibhelloworld.dylib をパッケージディレクトリ直下に配置
3. src/Makevars を編集
PKG_LIBS = -lhelloworld -L..
‘$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"‘
後はいつも通りでよい.
コンパイル時のディレクトリがパッケージ直下の src なので, -L..
とすることになる.
2
[他の場所にあるライブラリを使いたい]
共有ライブラリをパッケージディレクトリ直下以外に置くとビル
ドできない.
例えば src に置いて, PKG_LIBS の -L.. を -L. に変えてビルド
してみるとダメ.
ビルド実行結果ログをよく見ると,
-L でライブラリの位置を正しく指定していれば, コンパイルは成
功するのだが, その後に実行される動作確認的な library() 実行
時に, 共有ライブラリにパスが通っていないためにロード出来ず, エ
ラーとなっているということが分かる.
従って, 環境変数を設定しておけばいい.
パッケージ直下にライブラリを置く方法も, パッケージ直下のディ
レクトリ外で実行すると失敗することになる.
3
[まとめ:動的または共有ライブラリを使う方法]
1. Makevars ファイルでコンパイルオプション、特にヘッダファイ
ルの指定に PKG_CPPFLAGS を使い, ライブラリパスと名前を PKG_LIBS
で指定する.
2. 動的もしくは共有ライブラリへの実行時の参照を可能にするた
め, OS X であれば DYLD_LIBRARY_PATH を動的ライブラリの保存
場所に設定しておく. Linux なら LD_LIBRARY_PATH になる.

4
※参考: Writing R Extentions
http://cran.r-project.org/doc/manuals/R-exts.pdf
の Makevars ファイルに関する説明の抜粋
The most common use of a‘Makevars’file is to set additional preprocessor options (for
example include paths) for C/C++ files via PKG_CPPFLAGS, and additional compiler flags by
setting PKG_CFLAGS, PKG_CXXFLAGS, PKG_FFLAGS or PKG_FCFLAGS, for C, C++, FORTRAN
or Fortran 9x respectively (see Section 5.5 [Creating shared objects], page 101).
NB: Include paths are preprocessor options, not compiler options, and must be set in
PKG_CPPFLAGS as otherwise platform-specific paths (e.g.‘-I/usr/local/include’ will take
)
precedence.

5

Contenu connexe

Similaire à Rcppを使って動的もしくは共有ライブラリ (dylib, soファイル)を用いた関数(パッ ケージ)を作る

Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法Nagi Teramo
 
Railsの開発環境作るぞ
Railsの開発環境作るぞRailsの開発環境作るぞ
Railsの開発環境作るぞYoichi Toyota
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Daisuke Hiraoka
 
lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)Kazuhiro Nishiyama
 
Pry による repl 駆動開発について
Pry による repl 駆動開発についてPry による repl 駆動開発について
Pry による repl 駆動開発についてTomoya Kawanishi
 
とあるWeb企業でのDebianシステムの使い方。
とあるWeb企業でのDebianシステムの使い方。とあるWeb企業でのDebianシステムの使い方。
とあるWeb企業でのDebianシステムの使い方。Kouhei Maeda
 
Rails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2editionRails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2editionSatomi Tsujita
 
自分的pkgsrcの課題
自分的pkgsrcの課題自分的pkgsrcの課題
自分的pkgsrcの課題Ryo ONODERA
 
Rubyのコードを読んでみよう(オブジェクト編)
Rubyのコードを読んでみよう(オブジェクト編)Rubyのコードを読んでみよう(オブジェクト編)
Rubyのコードを読んでみよう(オブジェクト編)baban ba-n
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門Yasuko Ohba
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像Kiwamu Okabe
 
Alfrescoクラスタリング入門
Alfrescoクラスタリング入門Alfrescoクラスタリング入門
Alfrescoクラスタリング入門Ashitaba YOSHIOKA
 
Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825hiro345
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
DockerハンズオンKazuyuki Mori
 

Similaire à Rcppを使って動的もしくは共有ライブラリ (dylib, soファイル)を用いた関数(パッ ケージ)を作る (18)

Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
 
Railsの開発環境作るぞ
Railsの開発環境作るぞRailsの開発環境作るぞ
Railsの開発環境作るぞ
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!
 
Ruby In Wheezy
Ruby In WheezyRuby In Wheezy
Ruby In Wheezy
 
lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)
 
Pry による repl 駆動開発について
Pry による repl 駆動開発についてPry による repl 駆動開発について
Pry による repl 駆動開発について
 
とあるWeb企業でのDebianシステムの使い方。
とあるWeb企業でのDebianシステムの使い方。とあるWeb企業でのDebianシステムの使い方。
とあるWeb企業でのDebianシステムの使い方。
 
Rails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2editionRails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2edition
 
Yesod on Heroku
Yesod on HerokuYesod on Heroku
Yesod on Heroku
 
Fig
FigFig
Fig
 
自分的pkgsrcの課題
自分的pkgsrcの課題自分的pkgsrcの課題
自分的pkgsrcの課題
 
Rubyのコードを読んでみよう(オブジェクト編)
Rubyのコードを読んでみよう(オブジェクト編)Rubyのコードを読んでみよう(オブジェクト編)
Rubyのコードを読んでみよう(オブジェクト編)
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像
 
Alfrescoクラスタリング入門
Alfrescoクラスタリング入門Alfrescoクラスタリング入門
Alfrescoクラスタリング入門
 
Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
Dockerハンズオン
 

Dernier

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Dernier (10)

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

Rcppを使って動的もしくは共有ライブラリ (dylib, soファイル)を用いた関数(パッ ケージ)を作る

  • 1. Rcpp を使って動的もしくは共有ライブラリ (dylib, so ファイル) を用いた関数(パッ ケージ)を作る S.M. October 26, 2013
  • 2. Rcpp with Rstudio でビルドする際に、自作でもなんでもよい が, 共有ライブラリをリンクさせる方法. コンパイルオプション をどこで指定したらよいかが分からなかったのでまとめておく. ちなみに, パッケージでなく関数単位で簡易にやりたいと当初思っ たが, どうもパッケージを作るのが簡易な方法のようである. 動作確認環境は, Rstudio 0.97.248, Rcpp 0.10.5 libhelloworld.dylib と helloworld.h を用意しておく. 内容は察して下さい. 1
  • 3. [取りあえずやってみる] 1. RStudio の Package with Rcpp を作成 2. llibhelloworld.dylib をパッケージディレクトリ直下に配置 3. src/Makevars を編集 PKG_LIBS = -lhelloworld -L.. ‘$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"‘ 後はいつも通りでよい. コンパイル時のディレクトリがパッケージ直下の src なので, -L.. とすることになる. 2
  • 4. [他の場所にあるライブラリを使いたい] 共有ライブラリをパッケージディレクトリ直下以外に置くとビル ドできない. 例えば src に置いて, PKG_LIBS の -L.. を -L. に変えてビルド してみるとダメ. ビルド実行結果ログをよく見ると, -L でライブラリの位置を正しく指定していれば, コンパイルは成 功するのだが, その後に実行される動作確認的な library() 実行 時に, 共有ライブラリにパスが通っていないためにロード出来ず, エ ラーとなっているということが分かる. 従って, 環境変数を設定しておけばいい. パッケージ直下にライブラリを置く方法も, パッケージ直下のディ レクトリ外で実行すると失敗することになる. 3
  • 5. [まとめ:動的または共有ライブラリを使う方法] 1. Makevars ファイルでコンパイルオプション、特にヘッダファイ ルの指定に PKG_CPPFLAGS を使い, ライブラリパスと名前を PKG_LIBS で指定する. 2. 動的もしくは共有ライブラリへの実行時の参照を可能にするた め, OS X であれば DYLD_LIBRARY_PATH を動的ライブラリの保存 場所に設定しておく. Linux なら LD_LIBRARY_PATH になる. 4
  • 6. ※参考: Writing R Extentions http://cran.r-project.org/doc/manuals/R-exts.pdf の Makevars ファイルに関する説明の抜粋 The most common use of a‘Makevars’file is to set additional preprocessor options (for example include paths) for C/C++ files via PKG_CPPFLAGS, and additional compiler flags by setting PKG_CFLAGS, PKG_CXXFLAGS, PKG_FFLAGS or PKG_FCFLAGS, for C, C++, FORTRAN or Fortran 9x respectively (see Section 5.5 [Creating shared objects], page 101). NB: Include paths are preprocessor options, not compiler options, and must be set in PKG_CPPFLAGS as otherwise platform-specific paths (e.g.‘-I/usr/local/include’ will take ) precedence. 5