我使用 pimpl 习惯用法来隐藏接口的实现细节,以便我可以采取某种 ABI 保护措施。我不太熟悉 MS 的来龙去脉……我的大部分开发生涯都使用 Linux。
我无法从调试器检查窗口查看 pimpl 的内部。我的类型仅扩展至 impl 的原始指针(它使用智能指针)。我尝试过导出符号,但这似乎不起作用。我想我实际上想要查看的符号没有被导入或其他什么。
我该如何补救?可视化工具可以调用函数吗?
编辑——也许我把人们与导出的事情混淆了。
我正在尝试这个:
对象.h:
struct EXPORT object {
struct EXPORT impl;
impl * pimpl;
};
对象.cpp
struct EXPORT object::impl {
char member;
};
我认为解决该问题的唯一方法是将 impl 放入库的调试版本中包含的标头中。希望有更好的解决方案。
我无法使用此设置复制它:
CMakeLists.txt
cmake_minimum_required(VERSION 3.8.0)
project(test)
set(DLL_SRCS thing.cpp)
set(DLL_HDRS thing.h)
add_library(Thing SHARED ${DLL_SRCS} ${DLL_HDRS})
set(Headers_dir ${CMAKE_CURRENT_BINARY_DIR}/dll_public_headers)
configure_file(${DLL_HDRS} ${Headers_dir} COPYONLY)
set(APP_SRCS main.cpp)
add_executable(App ${APP_SRCS})
target_link_libraries(APP Thing)
include_directories(${Headers_dir})
thing.h
#pragma once
struct thing
{
private:
struct Private;
public:
thing();
Private * impl
};
东西.cpp
#include "thing.h"
struct thing::Private
{
char member;
}
thing::thing()
{
impl = new Private;
impl->member = 'a';
}
main.cpp
#include "thing.h"
int main(int argc, char * argv[])
{
thing thing_from_dll;
return 0;
}
如果您无法正常工作,我建议您提供类似的mcve https://stackoverflow.com/help/mcve。我对此不太敏感,所以别担心。我还是会帮你的。
这在 Visual Studio 2017 上有效。我在 return 0 上放置了一个断点,可以看到该成员的值为“a”。
我认为您的设置中可能缺少的唯一内容是调试器的源文件。也许它可以加载您的调试数据库,但实际上找不到您定义私有实现的文件。看here https://learn.microsoft.com/en-us/visualstudio/debugger/specify-symbol-dot-pdb-and-source-files-in-the-visual-studio-debugger?view=vs-2019了解更多详情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)