我正在编写一个包含两个库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服务器上运行。
答案 0 :(得分:1)
听起来你在Armadillo和trng4之间确实存在问题。也许你应该尝试,如果可能的话,将你的界面分开,这样你就不需要在同一个文件中包含这两个界面了。
答案 1 :(得分:0)
如果我错了,有人可以纠正我,但我相信你可以通过在每个头文件中使用#ifndef来防止这个问题,这样即使第二次包含它也不会定义第二次。但我猜这些不是你的档案......?
#ifndef __your_unique_header_name__
blah blah
#endif