我目前正在使用 C++ 的 elfutils 库进行工作,我正在努力解决一些应该显而易见的事情。
这是一个 MCVE 显示了我的问题:
文件.cpp
struct Elf64_Sym;
#include <elf.h>
当然,在完整的代码中,前向声明是在 .hpp 文件中完成的,而
<elf.h>
包含是在 .cpp 文件中完成的,但这个小示例重现了完全相同的问题。您可以尝试使用以下命令行来编译它g++ file.cpp
,您将收到以下错误:
In file included from /usr/include/libelf.h:36,
from file.cpp:3:
/usr/include/elf.h:538:3: error: conflicting declaration 'typedef struct Elf64_Sym Elf64_Sym'
538 | } Elf64_Sym;
| ^~~~~~~~~
file.cpp:1:8: note: previous declaration as 'struct Elf64_Sym'
1 | struct Elf64_Sym;
| ^~~~~~~~~
使用 gcc 可以很好地编译(在 C 中也是如此),但在 g++ 中则不行(在 C++ 中也是如此)。
您是否有允许在 C++ 中向前声明
Elf64_Sym
结构的解决方案?
为了完整起见,这里是
<elf.h>
中该结构的定义:
typedef struct
{
Elf64_Word st_name; /* Symbol name (string tbl index) */
unsigned char st_info; /* Symbol type and binding */
unsigned char st_other; /* Symbol visibility */
Elf64_Section st_shndx; /* Section index */
Elf64_Addr st_value; /* Symbol value */
Elf64_Xword st_size; /* Symbol size */
} Elf64_Sym;
您是否有允许在 C++ 中前向声明 Elf64_Sym 结构的解决方案?
您根本不需要在源文件中写入
struct Elf64_Sym
,因为您已经包含了具有所需 typedef 的标头。
您可以直接创建
Elf64_Sym
类型的对象,方法是:
Elf64_Sym object;
在源文件中。 工作演示