2016-07-22 7 views
0

一部の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ステートメントが必要であると推測していますが、それは可能ではないかもしれません。

答えて

2

最良の方法は、複雑なsrc/Makevarsファイルを避けることです。

静的ライブラリを構築するにはconfigureを使用してください。その後実際にはsrc/Makevarsという名前でビルドしてください。

私は、外部から提供されたライブラリをコピーするRblpapiと、nloptソースをダウンロードし、必要なときに(つまりlibnloptがシステム上にない)nloptrでそのスキームを使用します。

関連する問題