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

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

【问题讨论】:

    标签: c++ gcc compilation openmp rcpp


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      #ifndef __your_unique_header_name__
      
      blah blah
      
      
      #endif
      

      【讨论】:

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