[Rcpp-devel] Linking R package to a static library(For testing) resulting compilation failure
Akhila Chowdary Kolla
akhilakollasrinu424jf at gmail.com
Sat Mar 21 19:31:25 CET 2020
Hello,
I am trying to link the Rcpp package with "deepstate" which is a static
library helps us fuzz test the functions in the Rcpp package.
TestHarness.cpp file creates a test harness using TEST(). Test harness file
in RcppDeepState/src/TestHarness.cpp has code to test the function in
rcpp_interface.cpp
I tried compiling the code TestHarness.cpp and used -ldeepstate to a link
it to deepstate using :
*clang++ -o TestRcppharness TestRcppharness.cpp -I"/usr/share/R/include"
-I"/usr/lib/R/site-library/Rcpp/include" -ldeepstate*
But this does nothing and keeps throwing *static assertion failed: cannot
convert type to SEXP error.*
Below code: DeepState_Test class generates random numeric, Integer vectors
and later passing those inputs to the rcpp_binseg_normal(random numeric
vector, random Integer vector)
TestHarness.cpp
----------------------
#include <deepstate/DeepState.hpp>
#include "rcpp_interface.h"
#include <Rcpp.h>
using namespace Rcpp;
using namespace deepstate;
class DeepState_Test{
public:
Rcpp::NumericVector NumericRand_vec;
Rcpp::NumericVector values;
Rcpp::IntegerVector IntegerRand_vec;
Rcpp::NumericVector Missing_values(){
values = Rcpp::NumericVector::create(NA_REAL,R_NaN,R_PosInf,R_NegInf);
return values;
}
Rcpp::NumericVector RcppDeepState_NumericVector()
{
int num_vector_size = DeepState_RandInt();
NumericRand_vec = new NumericVector[num_vector_size];
for(int i=0; i< num_vector_size; i++){
OneOf(
[&] {
NumericRand_vec[i] = DeepState_Double();
},
[&] {
NumericRand_vec[i] =
DeepState_DoubleInRange(0,DeepState_Double());
});
}
return (NumericRand_vec);
}
Rcpp::IntegerVector RcppDeepState_IntegerVector(){
int int_vector_size = DeepState_RandInt();
IntegerRand_vec = new IntegerVector[int_vector_size];
for(int i=0; i< int_vector_size; i++){
OneOf(
[&] {
IntegerRand_vec[i] = DeepState_Int();
},
[&] {
IntegerRand_vec[i] =
DeepState_IntInRange(0,DeepState_RandInt());
});
}
return IntegerRand_vec;
}
};
TEST(Random_Set, Ranges) {
DeepState_Test *deeptest= new DeepState_Test();
Rcpp::NumericVector data_vec =
deeptest->RcppDeepState_NumericVector();
Rcpp::IntegerVector max_segments =
deeptest->RcppDeepState_IntegerVector();
//call to function in rcpp_interface
rcpp_binseg_normal(data_vec,max_segments);
}
function in rcpp_interface.cpp :
#include <Rcpp.h>
#include <R.h>
#include "binseg_normal.h"
#include "binseg_normal_cost.h"
// [[Rcpp::export]]
Rcpp::List rcpp_binseg_normal
(const Rcpp::NumericVector data_vec,
const Rcpp::IntegerVector max_segments) {
int kmax = max_segments[0];
Rcpp::IntegerVector end(kmax);
Rcpp::NumericVector loss(kmax);
Rcpp::NumericVector before_mean(kmax);
Rcpp::NumericVector after_mean(kmax);
Rcpp::IntegerVector before_size(kmax);
Rcpp::IntegerVector after_size(kmax);
Rcpp::IntegerVector invalidates_index(kmax);
Rcpp::IntegerVector invalidates_after(kmax);
int status = binseg_normal
(&data_vec[0], data_vec.size(), kmax,
//inputs above, outputs below.
&end[0], &loss[0],
&before_mean[0], &after_mean[0],
&before_size[0], &after_size[0],
&invalidates_index[0], &invalidates_after[0]);
if(status == ERROR_NO_DATA){
Rcpp::stop("no data");
}
if(status == ERROR_NO_SEGMENTS){
Rcpp::stop("no segments");
}
if(status == ERROR_TOO_MANY_SEGMENTS){
Rcpp::stop("too many segments");
}
return Rcpp::List::create
(Rcpp::Named("loss", loss),
Rcpp::Named("end", end),
Rcpp::Named("before.mean", before_mean),
Rcpp::Named("after.mean", after_mean),
Rcpp::Named("before.size", before_size),
Rcpp::Named("after.size", after_size),
Rcpp::Named("invalidates.index", invalidates_index),
Rcpp::Named("invalidates.after", invalidates_after)
) ;
}
*How can I compile Rcpp package or src/*.cpp files to get an executable
and linking a static library to it while it is being compiled.*
*How can I generate an executable Rcpp package using the command
line(command) by linking deep state library instead of generating a
RcppDeepState.so(not an executable) file dynamically using (R CMD INSTALL
.)*
Thanks,
Akhila Chowdary
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20200321/a3e4012c/attachment.html>
More information about the Rcpp-devel
mailing list