【问题标题】:Build for Mypintool sample for x64 using visual studio 2012 fails, if "windows.h" is included如果包含“windows.h”,则使用 Visual Studio 2012 为 x64 构建 Mypintool 示例失败
【发布时间】:2016-12-06 05:39:58
【问题描述】:

我正在尝试构建 Mypintool 示例,该示例附带用于 x64 架构的引脚分配。 我正在使用 pin3.0(构建 76991)和 Visual Studio 2012。如果我没有包含 windows.h,则构建成功。 但是如果我像这样包含window.h(在单独的命名空间中):-

namespace WD {
    #include "Windows.h"
}

然后构建给出错误:-

C:\Program Files (x86)\Windows Kits\8.0\Include\um\winnt.h(3486): error C2888: '_CONTEXT::<unnamed-tag>' : symbol cannot be defined within namespace 'WD'
C:\Program Files (x86)\Windows Kits\8.0\Include\um\winnt.h(3488): error C2888: '_CONTEXT::<unnamed-tag>::<unnamed-tag>' : symbol cannot be defined within namespace 'WD'

另外,我能够构建带有windows.h 的win32 工具,没有任何问题。此外,我比较了 win32 和 x64 的构建设置,但找不到任何差异。

感谢任何帮助。

【问题讨论】:

  • 不支持将 windows 标头包装在 c++ 命名空间内。如果它不起作用:不要这样做。
  • @ChrisBecke 将 windows 标头包装在 c++ 命名空间中对于为 win32 架构构建的 pintool 效果很好。这是 intel 提出的解决方案,因为 pin 与 winapi 名称有一些冲突。请参阅Conflicts between Pin and Windows 部分下的 pin 用户指南:software.intel.com/sites/landingpage/pintool/docs/76991/Pin/…
  • 然而,在 x64 位上,它失败了。明确告诉你它不能在 WD 命名空间中定义某些 windows 符号。没有比这更清楚的了。您可以在执行#include 之前尝试添加#define WIN32_LEAN_AND_MEAN。这使得 windows.h 省略了一些可能允许它构建的可选内容。
  • @ChrisBecke 我知道我无法在 WD 命名空间中定义某些 Windows 符号。但我需要包含“windows.h”才能使用 Windows API。由于与 pin API 冲突,我无法直接执行此操作。我也试过#define WIN32_LEAN_AND_MEAN,但同样的错误仍然存​​在。

标签: winapi visual-studio-2012 intel-pin


【解决方案1】:

我不清楚您是否有使用“Pin”的 Windows 应用程序或需要调用某些 Windows API 的“Pin”应用程序 - 或者在单个程序中大量使用两种 API 的混合。

尽管如此,Windows SDK 相当大,并且(大部分)被设计为与 C 一起使用,或者与与 C 兼容的 C++ 子集一起使用,因此如果包装在命名空间中,则无法预期它可以使用。

因此,处理标头冲突的唯一有效方法是避免在同一个 cpp 文件中包含“pin”或“windows”标头。您需要将程序中调用 windows 的部分和调用“pin”的部分划分为单独的 cpp 文件。

创建一个桥接头文件,该文件定义仅使用 C++ 声明的类和函数。由于它不使用 pin 或 windows,因此该文件可以被项目的双方#included。当然,根据您的应用程序试图实现的目标,这可能会很困难,因此您可能需要进行一些重型类型擦除。

类似这样的:

// pin.cpp
#include <intel/pin.h>
#include "bridge.h"

void method(){
  Window* wnd = Window::Create();
  wnd.Show();
}

.

// bridge.h
class Window {
public:
  static Window* Create();
  virtual void Show()=0;
};

.

// WindowsImpl.cpp
#include <windows.h>
#include "bridge.h"

class WindowImpl : public Window {
  HWND hwnd;
public:
  bool Create(){
    hwnd = CreateWindowEx(...);
    return hwnd != NULL;
  }
  void Show() override {
    ShowWindow(hwnd,...);
  }
};
Window* Window::Create(){
  WindowImpl* newWnd = new WindowImpl();
  newWnd->Create();
  return newWnd;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多