Linux用户空间标头无法使用g ++进行编译

时间:2017-04-14 15:12:55

标签: c++ linux gcc

我有一个cpp源文件,其中包含以下Linux uapi标头:

#include <linux/netfilter_ipv4/ip_tables.h>

我正在使用RH6,但标题似乎与Linux内核主线中的标题相同:http://lxr.free-electrons.com/source/include/uapi/linux/netfilter_ipv4/ip_tables.h

问题是在用g ++编译我的cpp源文件时,我(显然)收到以下错误:

/usr/include/linux/netfilter_ipv4/ip_tables.h:222: error: invalid conversion from 'void*' to 'xt_entry_target*'

我知道我可以用-fpermissive标志超越它,但这不是解决方案。

另外,我尝试将包含在extern "C" {}块中(据我所知,应该让编译器将其中的所有内容看作C代码并允许隐式转换),但错误不会消失

C ++程序如何处理这种C不兼容问题? (无法直接编辑源代码导致问题)

1 个答案:

答案 0 :(得分:0)

使用以下预处理语句:

#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2) || (__GNUC__ == 4 && __GNUC_MINOR__ == 2 && __GNUC_PATCHLEVEL__ > 3)
    #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6) || (__GNUC__ == 4 && __GNUC_MINOR__ == 6 && __GNUC_PATCHLEVEL__ > 3)
         #pragma GCC diagnostic push
    #endif

    #pragma GCC diagnostic ignored "-fpermissive"

    #include <linux/netfilter_ipv4/ip_tables.h>

    #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6) || (__GNUC__ == 4 && __GNUC_MINOR__ == 6 && __GNUC_PATCHLEVEL__ > 3)
         #pragma GCC diagnostic pop
    #endif
#else
    #error at least GCC 4.2.4 is required
#endif

使用以下网址提供的文档:https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas

考虑到GCC 4.2.4中引入了Diagnostic Pragmas,并且在GCC 4.6.4中引入了对这些pragma的推/弹操作的支持。

目前我正在使用4.4.7编译,因此pragma对整个翻译单元生效,但至少它不会强迫我在调用编译器时提供标志。

感谢@Richard Critten指出我正确的方向。

相关问题