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

Posted

技术标签:

【中文标题】先前声明中的 G++ 错误,由于包含中的重复函数名而导致的错误【英文标题】:G++ error from previous declaration, error due to duplicate function name in includes 【发布时间】:2014-02-14 20:17:53 【问题描述】:

我正在编写一个包含两个库 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服务器上运行。

【问题讨论】:

【参考方案1】:

听起来你在犰狳和 trng4 之间确实存在问题。如果可能的话,也许你应该尝试分离你的接口,这样你就不需要将两者都包含在同一个文件中。

【讨论】:

【参考方案2】:

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

#ifndef __your_unique_header_name__

blah blah


#endif

【讨论】:

我不明白。你是说去改变 RccpArmadillo.h 或 special_functions.hpp?应该有办法以更简单的方式完成此操作。事实上,每个不同的库可以有相同的函数名但不同的功能。我们通常可以使用命名空间从不同的库中访问相同的函数名。但我的问题是当两个 C 库在各自的头文件中具有相同的函数名时如何排除。 我也不认为这个建议是正确的。 我总是在每个头文件中看到#ifndef,但从技术上讲,它只需要在多个文件可能使用的头文件中(在你的情况下可能像 special_functions)。不同的头文件可以具有相同的函数名称,因为链接器会根据头文件本身为它们赋予唯一的名称。但是如果同一个头文件被包含两次并且它试图定义函数两次,链接器会给出完全相同的名称。无论如何,这是我的理解。 #ifndef 是一个包含保护,可防止包含相同的标头两次。这是一件好事。但这与OP的问题无关。 哦,我想我读错了。我以为他说两者都包含相同的标头,但他说这两个标头包含相同的功能。对不起。

以上是关于先前声明中的 G++ 错误,由于包含中的重复函数名而导致的错误的主要内容,如果未能解决你的问题,请参考以下文章

设计一个函数,它接受不定数量的参数,这是参数都是函数。这些函数都接受一个回调函数作为参数,按照回调函数被调用的顺序返回函数名

如何撤消 Github 中的先前提交 [重复]

如何使用 MongoDB/Mongoose 中的先前值更新字段 [重复]

Cython 中的枚举成员名称重复 - 重新声明错误?

删除先前已连接其他变量的字符串中的重复单词

MYSQL操作数据表中的记录