我怀疑这个问题是由于对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/

10-12 18:29