&引用;RcppArmadilloExtensions/sample.h“;程序包生成步骤中的链接器错误
我正在制作一个R包,它在一些源文件中使用了&引用;RcppArmadilloExtensions/sample.h“;程序包生成步骤中的链接器错误,rcpp,armadillo,r-package,Rcpp,Armadillo,R Package,我正在制作一个R包,它在一些源文件中使用了Rcpp::RcppArmadillo::sample()函数。特别是,我在4个不同的cpp文件中使用了该函数,并在每个文件中添加了这一行#include,以包含所需的头文件 在我想通过命令R CMD build mypackage构建包之前,一切都正常。我得到了重复符号错误,其中提到的头文件中定义的大多数函数都列为重复符号。例如,probsampleneplace、FixProb、sampleplace和walkerprobssampleplace等函
Rcpp::RcppArmadillo::sample()
函数。特别是,我在4个不同的cpp文件中使用了该函数,并在每个文件中添加了这一行#include
,以包含所需的头文件
在我想通过命令R CMD build mypackage
构建包之前,一切都正常。我得到了重复符号错误,其中提到的头文件中定义的大多数函数都列为重复符号。例如,probsampleneplace
、FixProb
、sampleplace
和walkerprobssampleplace
等函数都列为在这4个cpp文件之间重复的函数
我用谷歌搜索了这个问题,解决方法是在.cpp
文件中定义变量或函数,而不是在.h
文件中定义,以防止重复,如果您想在任何其他cpp
文件中使用这些变量,请使用extern
。但是我认为这个解决方案不适用于这里,因为头文件不是我写的,我不想对sample.h
头文件进行任何更改
有没有解决这个问题的建议?提前感谢您的帮助 根据德克的评论,这最终对我有效,如下所示: 我删除了每个文件顶部的冗余头并将其放在一个地方。它可以是一个访问函数,可以在任何需要的地方调用。
另一种选择是,如果您的整个项目没有那么大,您可以将标题
#include
放在一个文件的顶部。包含多个函数的cpp
文件可以处理该作业。我做了后者,我的.cpp
文件大约有400行。根据德克的评论,这最终对我有效,如下所示:
我删除了每个文件顶部的冗余头并将其放在一个地方。它可以是一个访问函数,可以在任何需要的地方调用。
另一种选择是,如果您的整个项目没有那么大,您可以将标题
#include
放在一个文件的顶部。包含多个函数的cpp
文件可以处理该作业。我做了后者,我的.cpp
文件大约有400行。你需要显示你的代码。这是不可复制的。“特别是,我在4个不同的cpp文件中使用了该函数”。你不能。它只能在一个文件中。这4个cpp文件中的每一个都有不同的用途,它们都需要该功能。所以我想你是建议把它们合并成一个文件。我想应该有另一种方法。谢谢,德克。你只能包含一次标题。如果您在不同的地方需要该功能,请编写一个从四个文件调用的访问函数。但是只有一个#包含sample()
文件的。太棒了!这确实奏效了!我最初认为它与其他可以添加到每个cpp文件开头的#include
行相同。不管怎样,你还是一如既往地救了我。谢谢你,德克!您需要显示您的代码。这是不可复制的。“特别是,我在4个不同的cpp文件中使用了该函数”。你不能。它只能在一个文件中。这4个cpp文件中的每一个都有不同的用途,它们都需要该功能。所以我想你是建议把它们合并成一个文件。我想应该有另一种方法。谢谢,德克。你只能包含一次标题。如果您在不同的地方需要该功能,请编写一个从四个文件调用的访问函数。但是只有一个#包含sample()
文件的。太棒了!这确实奏效了!我最初认为它与其他可以添加到每个cpp文件开头的#include
行相同。不管怎样,你还是一如既往地救了我。谢谢你,德克!