Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CMake安装的PDB文件 我使用CMAGE命令安装PDB文件,以便在我的C++应用程序的开发人员分发中启用调试。命令如下: INSTALL(DIRECTORY ${PROJECT_BINARY_DIR}/Debug DESTINATION bin FILES_MATCHING PATTERN *.pdb )_C++_Windows_Visual Studio_Cmake - Fatal编程技术网

使用CMake安装的PDB文件 我使用CMAGE命令安装PDB文件,以便在我的C++应用程序的开发人员分发中启用调试。命令如下: INSTALL(DIRECTORY ${PROJECT_BINARY_DIR}/Debug DESTINATION bin FILES_MATCHING PATTERN *.pdb )

使用CMake安装的PDB文件 我使用CMAGE命令安装PDB文件,以便在我的C++应用程序的开发人员分发中启用调试。命令如下: INSTALL(DIRECTORY ${PROJECT_BINARY_DIR}/Debug DESTINATION bin FILES_MATCHING PATTERN *.pdb ),c++,windows,visual-studio,cmake,C++,Windows,Visual Studio,Cmake,此外,我还设法在同一级别的“src”文件夹中安装了用于构建开发人员发行版的相关源代码,以便我的顶级发行版文件夹如下所示: include\ src\ lib\ bin\ share\ doc\ 3rdparty\ etc\ 如何让PDB文件“知道”源在哪里(我假设这是必需的)?是否有一个CMake命令可以实现这一点?一个小例子是什么?PDB文件按照编译程序时的方式存储文件的路径。您不必做任何事情让他们知道源文件的位置。PDB文件存储源文件的绝对路径名。当不使用符号服务器时,确保某种程度的源代码

此外,我还设法在同一级别的“src”文件夹中安装了用于构建开发人员发行版的相关源代码,以便我的顶级发行版文件夹如下所示:

include\
src\
lib\
bin\
share\
doc\
3rdparty\
etc\

如何让PDB文件“知道”源在哪里(我假设这是必需的)?是否有一个CMake命令可以实现这一点?一个小例子是什么?

PDB文件按照编译程序时的方式存储文件的路径。您不必做任何事情让他们知道源文件的位置。

PDB文件存储源文件的绝对路径名。当不使用符号服务器时,确保某种程度的源代码可重定位性的唯一方法是使用
subst
命令

其思想是使用
subst
为源代码树的根创建驱动器号名称(例如
N:\
)。然后从该驱动器执行构建,以便将以
N:\
开头的绝对路径嵌入到PDB文件中。当您以后需要在另一台机器上调试可执行文件时,请在该机器上使用
subst
,以获得到源文件的相同绝对路径。这将使PDB文件能够找到源文件

例如,如果您有一个文件
C:\MySources\main.cpp
,请执行以下操作:

subst N: C:\MySources
N:
run your build
稍后,假设您需要在一台机器上进行调试,其中相同的文件存储在
D:\Devel\Other\main.cpp
中。只需执行
subst N:D:\Devel\Other
,然后也从
N:
驱动器工作



这个答案很大程度上是基于本文中的信息和其中的链接。

您只需要通知Visual Studio源代码在哪里。。。将弹出文件浏览器对话框;如果路径与构建时不同,只需指向本地计算机上的源代码即可。

我只是提出了类似的问题

使用此安装规则将目标的PDB文件(如果存在)复制到目标的安装位置bin目录

install(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}> DESTINATION bin OPTIONAL)
安装(文件$DESTINATION bin可选)

你确定这一点吗?我的意思是,如果它是PDB文件存储的绝对路径(到源代码的绝对路径),那么当我在另一个开发人员的工作站上使用时,它如何确定这一点?如果它是相对的,那么我是否应该确保我将源代码安装在与PDB“相对”相同的位置,就像它在构建时一样?我希望我说的有道理…你可以一直测试这个。。。VisualStudio(和WinDBG)都非常聪明,可以映射PDB的位置和源代码。VS将在与加载的模块相同的目录中查找PDB(也可以查看调试器中的模块选项卡)。您还可以通过调试选项告诉VS在哪里查找。当您单击堆栈调用时,如果源位于其他位置,VS将提示您输入位置。这甚至适用于崩溃转储。如果我们都必须有完全相同的源代码树布局,那么这种扩展会有多糟糕?你可能想看看。谢谢@Angew-我阅读了这篇文章以及其中的链接。我真的要经历所有的符号服务器业务吗?我想我要问的是:是否有一种聪明的方式来打包PDB和匹配的源代码,这样我就不必做任何其他事情(按照第一个答案的思路)。我没有场外调试的个人经验,但是我从所有关于移动PDB的文章中得到的印象是,您必须使用
subst
或精确地镜像原始源代码树。出于好奇,我计划有朝一日调查这个问题;不幸的是,对于某一天相当不清楚的值。不幸的是,PDB中似乎嵌入了绝对路径名,因此必须镜像这些路径名。这就是建议使用
subst
的原因。其想法是在
N:
驱动器上进行构建,以便
N:\
作为根目录嵌入到PDB文件中。然后,另一个开发人员必须在他们的计算机上执行
subst
,以便他的计算机上
N:
驱动器上的源路径与您的计算机上的路径相同。PDB将起作用。也就是说,如果你有一个文件
C:\MySources\main.cpp
,你做了
subst N:C:\MySources
,如果他有一个文件
D:\Devel\Other\main.cpp
,他将不得不做
subst N:D:\Devel\Other
,然后也从
N:
驱动器工作。这个方案不能在任何地方使用。如果您的组织足够大,可能是驱动器号已被使用,或者您没有网络访问权限。总而言之,我认为使用StSTS作为代码嗅觉并避免它们。正如Matt在下面所说的,如果需要,IDE将提示输入源位置。事实上,所有调试器都能够从不同于构建时使用的路径加载源。