我怀疑这个问题是由于对c++的误解引起的,但是由于我使用的是Rcpp,所以我已经将问题标记为这样。我创建了两个函数,每个函数都在一个单独的.cpp文件中。
f1.cpp:
// [[Rcpp::depends(RcppProgress)]]
#include <progress.hpp>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector f1(int n)
{
int i;
Progress p(n, true);
NumericVector x(n);
for( i = 0 ; i < n ; i++ )
{
if (Progress::check_abort() )
Rcpp::stop("Operation cancelled by interrupt.");
p.increment(); // update progress
x[i] = Rf_rnorm(0,1);
}
return x;
}
f2.cpp:
// [[Rcpp::depends(RcppProgress)]]
#include <progress.hpp>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector f2(int n)
{
int i;
Progress p(n, true);
NumericVector x(n);
for( i = 0 ; i < n ; i++ )
{
if (Progress::check_abort() )
Rcpp::stop("Operation cancelled by interrupt.");
p.increment(); // update progress
x[i] = Rf_rgamma(1,1);
}
return x;
}
它们都依赖于RcppProgress。当我仅使用这些文件之一编译程序包时,我没有问题。但是当我同时编译两者时,出现链接器错误:
duplicate symbol __Z14checkInterruptv in:
f1.o
f2.o
duplicate symbol __ZN8Progress18_monitor_singletonE in:
f1.o
f2.o
ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我认为这意味着我需要将
#include <progress.hpp>
放在一个单独的头文件中,以包含在每个这些cpp文件中,但是我尝试过没有运气。我也看过使用Rcpp / RcppProgress的其他软件包,但是我应该改变什么并不明显。 最佳答案
这不是你的错。这是RcppProgress作者的错。他们的progress.hpp
有
class Progress {
// ...
private: // ===== INSTANCE VARIABLES
static InterruptableProgressMonitor* _monitor_singleton;
};
InterruptableProgressMonitor* Progress::_monitor_singleton = 0; // <-- this defines _monitor_singleton
同样,间接包含的
interrupts.hpp
包含bool checkInterrupt() {
return (R_ToplevelExec(chkIntFn, NULL) == FALSE);
}
当您将 header 包含在两个单独的翻译单元(即
.cpp
文件)中时,这两个都将导致违反“一个定义规则”,表现为您遇到的链接器错误。要解决此问题,您将需要以某种方式重新排列代码,以便只有一个.cpp
文件包含progress.hpp
(例如,通过将两个文件合并为一个文件),或对其 header 文件进行一些编辑。关于c++ - 编译软件包Rcpp,RcppProgress时“2 duplicate symbols for architecture”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25708813/