一部のRcppコードにCライブラリを組み込もうとしています。外部ライブラリを使用しようとすると、未定義の参照
私はCライブラリをC++プログラムで簡単に使うことができます。/libフォルダに.aと.dllファイルを作成するCライブラリを作成します。 、これは本質的た.cppプログラムを取るために、コンパイラに指示します
cc myfile.cpp -o myfile -Ipath.to.header path.to.lib.a -lz
-Iから、リンクにヘッダを含める:私は、プログラムのヘッダを含めて、コマンドラインから次のようなものを実行して、パッケージを使用することができます2つのライブラリに
私がmakevarsを正しく理解していれば、Rcppでこれを動作させるのは難しいことではありません(残念なことにそう思わない)。
は、私は私のパッケージ内のフォルダにライブラリを追加し、SRCに私はこのようになりmakevarsとmakevars.win追加:
PKG_CFLAGS=
# specify header location
PKG_CPPFLAGS=-Ipath.to.lib/include
# specify libs to link to
PKG_LIBS=path.to.lib/lib/file.a -lz
# make library
path.to.lib/lib/file.a:
cd path.to.lib;$(MAKE)
これは正しく「なり」.Aと.dllファイルをしかし、ライブラリでは、Rcppの魔法のどれも実行されません(つまり、ビルドでは、srcのファイルをコンパイルするg++
システムコールは見られません)ので、 "Dllは作成されませんでした"。
これは、ライブラリを作成する私のmakevarsターゲットの問題です。その部分をmakevarsから削除し、パッケージをビルドする前にライブラリをコマンドラインから自分で作成すると、-の呼び出しで-Iと-lステートメントが正しく呼び出されますが、未定義の参照についてはエラーが発生します。
-lステートメントは、最後の.dllが行われる最後のg++
呼び出しにのみ含まれていますが、ライブラリヘッダーを含むファイルがコンパイルされた以前のg++
呼び出しには含まれていません。
だから私は2つの問題を抱えている:それは、ライブラリを「作る」が、SRCのファイルをコンパイルからRcppを停止しないように
がどのように私は私のmakevarsを修正するのですか?
未定義の参照はどのように扱いますか?ライブラリは明らかにヘッダーのみではないので、以前の
g++
呼び出しでは-lステートメントが必要であると推測していますが、それは可能ではないかもしれません。