如何 link 提升 date_time
How to link to boost date_time
例子
我有一个 Rcpp 函数,我想在其中调用 boost::posix_time::time_from_string()
。
我已经从 boost documentation 中获取示例代码并使用 Rcpp
将其转换为 c++ 函数
library(Rcpp)
cppFunction(
includes = '
#include <boost/date_time/posix_time/posix_time.hpp>
',
code = '
void time_test() {
std::string t = "2002-01-20 23:59:59.000";
boost::posix_time::ptime pt(boost::posix_time::time_from_string(t));
Rcpp::Rcout << "time from string: " << pt << std::endl;
}
',
depends = "BH"
)
但是,这无法编译。
我看到一些评论说你需要 link 到 -lboost_date_time
,例如 Dirk 的 RcppBDT
库中的 this line
// The next function uses the non-stream-based parsing in Boost Date_Time
// and requires _linking_ with -lboost_date_time which makes the (otherwise
// header-only) build more complicate
// // [ [ Rcpp::export ] ]
// Rcpp::DatetimeVector charToPOSIXctNS(Rcpp::CharacterVector sv) {
// ... code omitted ...
// }
问题
除了包含 posix_time.hpp
header,您如何向 lboost_date_time
提供适当的 link,以便可以使用 time_from_string()
?
额外信息
可以使用 boost/date_time
库中的其他函数,如该函数所示,那么 time_from_string()
有何不同?
cppFunction(
includes = '
#include <boost/date_time/posix_time/posix_time.hpp>
',
code = '
void time_test() {
Rcpp::Datetime dt("2002-01-20 23:59:59.000");
boost::posix_time::hours h( dt.getHours() );
boost::posix_time::minutes m( dt.getMinutes() );
boost::posix_time::seconds s( dt.getSeconds() );
Rcpp::Rcout << h << std::endl;
Rcpp::Rcout << m << std::endl;
Rcpp::Rcout << s << std::endl;
}
',
depends = "BH"
)
time_test()
# 12:00:00
# 00:59:00
# 00:00:59
如您所知,您需要 link 在系统级别进行提升。 BH 包是不够的。所以首先你必须安装所需的boost库。在 Debian (dervied) Linux 系统上,这可以通过
完成
sudo apt-get install libboost-date-time-dev
然后你需要告诉 R 添加 -I/path/to/boost/headers
和 -L/path/to/boost/libraries -lboost_date_time
到编译器标志。您可以通过设置适当的环境变量来做到这一点:
library(Rcpp)
Sys.setenv(PKG_LIBS="-L/usr/lib -lboost_date_time", PKG_CPPFLAGS="-I/usr/include")
cppFunction(
includes = '
#include <boost/date_time/posix_time/posix_time.hpp>
',
code = '
void time_test() {
std::string t = "2002-01-20 23:59:59.000";
boost::posix_time::ptime pt(boost::posix_time::time_from_string(t));
Rcpp::Rcout << "time from string: " << pt << std::endl;
}
'
)
备注:
- 也可以为此定义一个 Rcpp 插件。
- 在我的例子中,
-I...
和 -L...
是不必要的,因为库安装在标准位置。不过,在其他情况下确实需要这些标志。
例子
我有一个 Rcpp 函数,我想在其中调用 boost::posix_time::time_from_string()
。
我已经从 boost documentation 中获取示例代码并使用 Rcpp
将其转换为 c++ 函数library(Rcpp)
cppFunction(
includes = '
#include <boost/date_time/posix_time/posix_time.hpp>
',
code = '
void time_test() {
std::string t = "2002-01-20 23:59:59.000";
boost::posix_time::ptime pt(boost::posix_time::time_from_string(t));
Rcpp::Rcout << "time from string: " << pt << std::endl;
}
',
depends = "BH"
)
但是,这无法编译。
我看到一些评论说你需要 link 到 -lboost_date_time
,例如 Dirk 的 RcppBDT
库中的 this line
// The next function uses the non-stream-based parsing in Boost Date_Time
// and requires _linking_ with -lboost_date_time which makes the (otherwise
// header-only) build more complicate
// // [ [ Rcpp::export ] ]
// Rcpp::DatetimeVector charToPOSIXctNS(Rcpp::CharacterVector sv) {
// ... code omitted ...
// }
问题
除了包含 posix_time.hpp
header,您如何向 lboost_date_time
提供适当的 link,以便可以使用 time_from_string()
?
额外信息
可以使用 boost/date_time
库中的其他函数,如该函数所示,那么 time_from_string()
有何不同?
cppFunction(
includes = '
#include <boost/date_time/posix_time/posix_time.hpp>
',
code = '
void time_test() {
Rcpp::Datetime dt("2002-01-20 23:59:59.000");
boost::posix_time::hours h( dt.getHours() );
boost::posix_time::minutes m( dt.getMinutes() );
boost::posix_time::seconds s( dt.getSeconds() );
Rcpp::Rcout << h << std::endl;
Rcpp::Rcout << m << std::endl;
Rcpp::Rcout << s << std::endl;
}
',
depends = "BH"
)
time_test()
# 12:00:00
# 00:59:00
# 00:00:59
如您所知,您需要 link 在系统级别进行提升。 BH 包是不够的。所以首先你必须安装所需的boost库。在 Debian (dervied) Linux 系统上,这可以通过
完成sudo apt-get install libboost-date-time-dev
然后你需要告诉 R 添加 -I/path/to/boost/headers
和 -L/path/to/boost/libraries -lboost_date_time
到编译器标志。您可以通过设置适当的环境变量来做到这一点:
library(Rcpp)
Sys.setenv(PKG_LIBS="-L/usr/lib -lboost_date_time", PKG_CPPFLAGS="-I/usr/include")
cppFunction(
includes = '
#include <boost/date_time/posix_time/posix_time.hpp>
',
code = '
void time_test() {
std::string t = "2002-01-20 23:59:59.000";
boost::posix_time::ptime pt(boost::posix_time::time_from_string(t));
Rcpp::Rcout << "time from string: " << pt << std::endl;
}
'
)
备注:
- 也可以为此定义一个 Rcpp 插件。
- 在我的例子中,
-I...
和-L...
是不必要的,因为库安装在标准位置。不过,在其他情况下确实需要这些标志。