c++ - 尝试在 libemu 中使用 emu_instruction 给出前向声明错误

标签 c++ c struct forward-declaration

我正在编写一个代码混淆工具作为我硕士论文的一部分,但我遇到了一些问题。

我使用 libemu 来模拟 x86 指令,我想读取一个包含 hexcode 的输入文件并将指令存储在一个 vector 中。在 libemu 中,指令由 struct emu_instruction 表示我也想在我的程序中使用这个结构,因为 libemu 还提供了一个解析器。这就是我想使用它的方式:

模拟器.cpp

std::vector<struct emu_instruction*> Emulator::getInstructionVector()
{
    std::vector<struct emu_instruction*> v;
    //e is my struct emu*
    while(emu_cpu_parse(emu_cpu_get(e))) {
        v.push_back(&emu_cpu_get(e)->instr);
    }

    return v;
}

emulator.h(我更改了导入路径)

#ifndef EMULATOR_H
#define EMULATOR_H 

#include <vector>

extern "C" {
#include "~/libemu/libemu/include/emu/emu.h"
#include "~/libemu/libemu/include/emu/emu_memory.h"
#include "~/libemu/libemu/include/emu/emu_cpu.h"
#include "~/libemu/libemu/include/emu/emu_log.h"
#include "~/libemu/libemu/include/emu/emu_instruction.h"
}

class Emulator {

public:
Emulator();
~Emulator();

void loadProgramInMemory(unsigned char instructionBytes[], int instructionBytesLen);
std::vector<struct emu_instruction*> getInstructionVector();
int runAndGetEFlags();
void printDebug();

private:
struct emu *e;
struct emu_memory *mem;
int static_offset;
};

#endif

我必须更改 emu_instruction 中的导入路径才能使其编译。

我在尝试运行这段代码时遇到的错误是

emulator.cpp: In member function ‘std::vector<emu_instruction*> Emulator::getInstructionVector()’: emulator.cpp:29:29: error: invalid use of incomplete type ‘struct emu_cpu’ ~/libemu/libemu/include/emu/emu.h:45:8: error: forward declaration of ‘struct emu_cpu’

此时我不知道该怎么做,因为我不完全理解这个错误。任何帮助将不胜感激。

添加生成文件。

生成文件:

CXX     = g++
CC      = g++

SRC = $(wildcard *.cpp)
OBJ = $(SRC:.cpp=.o)

# Executables 
PROGS   = program

all: $(PROGS)

program: program.o parser.o instruction.o emulator.o           /home/user/libemu/libemu/src/.libs/libemu.a
$(CXX) $(CXXFLAGS) program.o parser.o instruction.o emulator.o /home/user/libemu/libemu/src/.libs/libemu.a -ludis86 -o program.out

parser: parser.o instruction.o
$(CXX) $(CXXFLAGS) parser.o instruction.o -ludis86

clean:
rm -f *.o

cleaner: clean
rm -f $(PROGS) *.out

%.d: %.cpp
    @set -e; rm -f $@; \
    $(CXX) -MM $(CXXFLAGS) $< > $@.$$$$; \
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
    rm -f $@.$$$$

最佳答案

确实很难猜出 emulator.cpp 的第 29 行是什么,但我认为您的 compilec 无法找到其余的 libemu header 。 尝试将 emu_instruction 的路径恢复为原始路径,并添加到编译器行键中,例如 -I/home/user/libemu/libemu/include 以指向带有标题的位置。

关于c++ - 尝试在 libemu 中使用 emu_instruction 给出前向声明错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22144363/

相关文章:

c - 使用不同的分隔符 C 代码将 token 拆分两次

python 结构体,不需要的额外字节

c - malloc/结构指针数组段错误

c++ - 使用 libopenssl 从私有(private)转储公钥

c++ - 如果字段通过引用传递,则类字段可以在 const 方法内修改吗?

c++ - 使用 <ctime> 生成日期 vector

c++ - 如何在不使用信号槽连接的情况下触发 Action ?

c - 如何防止 Visual C 编译器优化掉 "unused"全局变量

c - 了解 file_operations 的 loff_t *offp

java - 如何在 C 编程中打印结构,类似于 c 中 Java 的 toString() 方法?