我正在使用pimpl成语来隐藏接口的实现细节,以便我可以有一些ABI保护措施。我不太了解MS的细节......在我的大部分开发生涯中使用Linux。
我无法从调试器检查窗口查看pimpl的内部。我的类型只扩展到impl的原始指针(它使用智能指针)。我已尝试导出符号,但这似乎不起作用。我想我实际上想要查看的符号没有被导入或者其他东西。
我该如何解决这个问题?可视化工具可能会调用函数吗?
编辑 - 也许我把人们与出口事物搞混了。
我正在尝试这个:
object.h:
struct EXPORT object {
struct EXPORT impl;
impl * pimpl;
};
object.cpp
struct EXPORT object::impl {
char member;
};
我能想到解决问题的唯一方法是将impls放在包含在库的调试版本中的头文件中。希望有更好的解决方案。
答案 0 :(得分:0)
我无法使用此设置复制它:
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
};
thing.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。我对此不那么感兴趣,所以不用担心。我仍然会帮助您。
这在Visual Studio 2017上有效。我在返回0处设置了一个断点,可以看到该成员的值为'a'。
我认为您的设置中可能唯一缺少的是调试器的源文件。也许它可以加载您的调试数据库,但实际上找不到您定义了私有实现的文件。请查看here,以获取更多详细信息。