Galaxy★☆ 2024-03-10 10:44 采纳率: 0%
浏览 18
已结题

rstudio的 undefined reference问题

Rstudio中尝试build一个包遇到了undefined reference的问题

Error in (function (command = NULL, args = character(), error_on_status = TRUE,  : 
  System command 'Rcmd.exe' failed, exit status: 1, stdout + stderr (last 10 lines):
E> VF_cppfunction.cpp: In function 'std::vector<int> reverseFour(std::vector<int>)':
E> VF_cppfunction.cpp:72:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
E>   for(int revPos = 0; revPos < Four.size(); revPos++)
E>                              ^
E> E:/Rtools/mingw_64/bin/g++ -shared -s -static-libgcc -o VirFinder.dll tmp.def RcppExports.o VF_cppfunction.o -LE:/r/bin/x64 -lR
E> RcppExports.o:RcppExports.cpp:(.rdata+0x720): undefined reference to `VirFinder_countSeqFeatureCpp'
E> collect2.exe: error: ld returned 1 exit status
E> no DLL was created
E> ERROR: compilation failed for package 'VirFinder'
E> * removing 'C:/Users/86181/AppData/Local/Temp/RtmpSUmaXf/devtools_install_57b0718a343f/VirFinder'

这个R package是可以正常install的,但是一旦我想要创建一个项目,build或者devtools::load_all()的时候就出现以上报错



// Enable C++11
// [[Rcpp::plugins("cpp11")]]
// [[Rcpp::export]]
List countSeqFeatureCpp( CharacterVector RseqDNA,  int k) {
    
    // convert to C++ type
    //Rcout << "seq is " ;
//    char seqDNAChar[RseqDNA.size()];
//    for( int i=0; i < RseqDNA.size(); i++ ){
//        //Rcout << RseqDNA[i];
//        seqDNAChar[i] = Rcpp::as< char >(RseqDNA[i]);
//    }
    
    unsigned long power = 1; for( int i = 0; i < k-1; i++) power *= 4;
    HashTable.clear();

    // count kmer
    unsigned long total = SeqKmerCountSingle(RseqDNA, k, power);
    
    // pair words and output count
    //vector<unsigned long> kmerTen;
    vector<double> kmerCount;
    loadToVector(k, total, kmerCount);
    //Rcout << "\n total:" << total << endl;

    // convert to Rcpp type
    //NumericVector RkmerTen(kmerTen.size());
    //RkmerTen = kmerTen;
    //NumericVector RkmerCount(kmerCount.size());
    //RkmerCount = kmerCount;
    
    List ret;
    //ret["kmerTen"] = kmerTen;
    ret["kmerCount"] = kmerCount;
    return ret;
    
}




这是被显示未定义的函数,在src文件夹下

非常感谢!

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2024-03-10 10:45
    关注

    Galaxy★☆ 上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    在Rcpp中遇到undefined reference错误,通常是因为链接器找不到在C++源文件中声明但未实现的函数。在这个案例中,VirFinder_countSeqFeatureCpp 函数在编译时被引用了,但在链接阶段却找不到它的实现。

    解决方案:

    1. 确认函数实现:

      • 确保 countSeqFeatureCpp 函数(或者名称与报错中的名称匹配的实际函数)在 .cpp 文件中有完整的定义和实现,并且这个源文件已经被正确包含在项目中并参与编译。
    2. 检查Makevars或 DESCRIPTION文件:

      • 在R包的根目录下查看 src/Makevars 或者 DESCRIPTION 文件,确保所有必要的源文件都被正确列出,以便于R CMD build和devtools::build能正确编译这些源文件。
    3. 正确的Rcpp导出声明:

      • 确认 countSeqFeatureCpp 函数使用了正确的 [[Rcpp::export]] 注解进行导出,如下所示:
        // [[Rcpp::export]]
        List countSeqFeatureCpp(CharacterVector RseqDNA, int k) {
            // ... 函数实现 ...
        }
        
    4. 清理并重新构建:

      • 清理之前编译生成的临时文件和库,然后尝试重新构建包。在Rstudio中,你可以尝试 devtools::clean(),然后再次运行 devtools::build()devtools::load_all()
    5. 检查依赖项:

      • 检查是否存在其他未链接的库或者依赖项,这可能也会导致undefined reference错误。

    如果以上步骤都已检查无误,请确保你的R包开发环境配置正确,包括Rtools、Rcpp等工具链的版本兼容性问题。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月10日
  • 创建了问题 3月10日