【发布时间】:2017-05-03 08:00:50
【问题描述】:
我有一个带有 Fortran 控制台应用程序项目(英特尔 Fortran 编译器)和 C++/CLI 库的解决方案(VS 2015)。我正在通过 Fortran C 绑定调用 C++ 库。
C++ 端的示例函数:
extern "C" __declspec(dllexport) void PrintInteger(const int * const a)
{
std::cout << *a << std::endl;
}
Fortran端对应函数:
module CplusplusWrapper
interface
subroutine PrintInteger(a) bind (C, name = "PrintInteger" )
use iso_c_binding
implicit none
integer (c_int), intent(in) :: a
end subroutine
end interface
end module
现在,幸运的是,我得到了这个工作。我什至可以开始调试 Fortran 应用程序,然后进入调用的 C++ 代码。但是,一旦我将任何托管功能添加到我的 C++/CLI 项目中,这将不再起作用。它甚至不必在同一个函数中,它可以是一个完全不同的文件......
我已经尝试进入 C++ 项目的属性 -> 配置 -> 调试并将调试器类型设置为“混合”,但没有效果。
关于如何启用对托管代码的调试的任何提示?
【问题讨论】:
-
调试器类型必须是混合的。您需要在 VS 版本 >= VS2012 上勾选工具 > 选项 > 调试 > 常规 > 使用托管兼容模式。并且您需要在 C++/CLI 代码上设置断点,您不能从本机代码单步执行到托管代码。
-
两个选项现在都按照你说的设置好了,但是调试器没有到达断点。如果我尝试单步进入 C++/CLI 代码,它会告诉我“源不可用”。但是,c++ 项目的 *.pdb 文件与 fortran 可执行文件位于同一目录中。还有什么想法吗? :-)
-
Debug > Windows > Modules,确保要调试的DLL在列表中。右键单击它 > 符号加载信息会告诉您它在哪里查找 PDB 文件。如果调试器无法找到源代码,它将提示您输入位置。如果您曾经单击取消,那么它不会再询问您。右键单击解决方案节点 > 属性 > 调试源文件 > “请勿查看”列表应该为空。您可以在同一对话框中添加目录。
-
在模块窗口中(只能在调试时访问,我花了一些时间才发现),它告诉我我的 c++ dll 的符号已加载,调试日志中也提到了这一点。 ..奇怪...
-
还有什么想法吗?我证实,一旦我将 C++ 项目从非托管更改为 /CLR,调试的可能性实际上就消失了,即使我没有引入任何“托管”。我还尝试了一堆其他开关,但没有成功......
标签: visual-studio fortran c++-cli fortran-iso-c-binding