【问题标题】:Function Pointer multiple definition [duplicate]函数指针多重定义[重复]
【发布时间】:2013-05-30 08:05:44
【问题描述】:

我有以下代码:

Header.hpp:

#ifndef HEADER_HPP_INCLUDED
#define HEADER_HPP_INCLUDED
#include<Windows.h>

extern HMODULE Module;
extern "C" bool __stdcall Initialized(void);
void (__stdcall *ptr_DetourPoint) (int X, int Y);

#endif //HEADER_HPP_INCLUDED

Header.cpp:

#include "Header.hpp"
HMODULE Module = nullptr;

bool __stdcall Initialize(void)
{
    Module = LoadLibrary("Point.dll");
    ptr_DetourPoint = reinterpret_cast<(__stdcall *)(int, int)>(GetProcAddress(Module, "PointFunc"));
    return ptr_DetourPoint != nullptr;
}

extern "C" __stdcall HookDetourPoint(int X, int Y)
{
    //Do stuff here..
    ptr_DetourPoint(X, Y);
}

main.cpp:

#include <windows.h>
#include "Header.hpp"

extern "C" bool __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            Initialized();
            DisableThreadLibraryCalls(hinstDLL);
            break;

        case DLL_PROCESS_DETACH:
            break;

        default:
            break;
    }
    return true;
}

在上面,当我使用 Mingw 4.8 编译它时,我得到:

obj\Release\main.o:main.cpp:(.bss+0xb78): multiple definition of `ptr_DetourPoint'
obj\Release\Implementations\Header.o:Header.cpp:(.bss+0xb80): first defined here

任何想法为什么我会得到这个?我不想键入定义我的函数指针。

【问题讨论】:

    标签: c++


    【解决方案1】:

    简短的回答是ptr_DetourPoint 声明了一个全局函数指针,另一条数据如Module。要修复它,您也可以将其标记为“extern”。但我怀疑您是否需要在标题中公开它,因为它似乎只是header.cpp 中的一个实现细节。

    【讨论】:

      【解决方案2】:

      该变量在标头中定义,这意味着包含它的任何源文件都定义了该符号。结果是将 main.cpp 和 Header.cpp 链接在一起定义了 ptr_DetourPoint 两次。你只需要在一个源文件中定义它,如果其他文件需要看到它,则在头文件中将其声明为extern。

      【讨论】:

      • 但是如果我输入 extern 那么它会显示“Header.cpp 中的未定义引用:S 这是否意味着我需要将相同的代码再次复制到 .cpp 文件中?
      • 是的,你需要在 cpp 文件中没有 extern 的同一行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 2020-04-13
      • 2011-03-03
      • 1970-01-01
      • 2014-01-04
      • 2015-07-01
      相关资源
      最近更新 更多