来自先前声明的G ++错误,由于包含中的重复函数名称而导致错误

时间:2014-02-14 20:17:54

标签: c++ gcc compilation openmp rcpp

我正在编写一个包含两个库RcppArmadillo和trng4的Rcpp代码。但是,当我包含两个头文件(RcppArmadillo.h和trng / gamma_dist.hpp)时,它会出现编译错误。

 trng/special_functions.hpp:47:39: error: declaration of ‘float lgammaf(float) throw ()’ has a  different exception specifier
 extern "C" float lgammaf(float) throw();
include-fixed/math.h:476:14: error: from previous declaration ‘float lgammaf(float)’
extern float lgammaf(float);

完整的编译选项

-fopenmp -lgomp -DUSE_R -DNDEBUG -DDISABLE_SINGLE -DNTHROW -DDISABLE_FIO -I/usr/local/include -I"/Users/avi/Library/R/3.0/library/Rcpp/include" -I"/Users/avi/Library/R/3.0/library/RcppArmadillo/include"   -fPIC -pipe -std=c++0x -Wall -pedantic -c 

似乎在两个头文件中都声明了lgammaf。我尝试使用-E和g ++选项,但是给了ld警告“.o,文件是为不支持的文件格式构建的”并且在我在R中加载后尝试使用.Call时没有提供错误功能。我做错了什么?

也许脱离上下文我正在使用trng4包开发一个线程gibbs采样器(在openmp中),它来自gamma分布。我目前正在运行此MacOS。但最终它将在linux服务器上运行。

2 个答案:

答案 0 :(得分:1)

听起来你在Armadillo和trng4之间确实存在问题。也许你应该尝试,如果可能的话,将你的界面分开,这样你就不需要在同一个文件中包含这两个界面了。

答案 1 :(得分:0)

如果我错了,有人可以纠正我,但我相信你可以通过在每个头文件中使用#ifndef来防止这个问题,这样即使第二次包含它也不会定义第二次。但我猜这些不是你的档案......?

#ifndef __your_unique_header_name__

blah blah


#endif