【问题标题】:Debugging Fortran mixed with C++/CLI调试与 C++/CLI 混合的 Fortran
【发布时间】: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


【解决方案1】:

我找到了解决问题的方法,在 intel website 上进行了描述。

创建一个不需要包含任何文件的虚拟 C# 类库。将此虚拟项目设置为解决方案的启动项目(右键单击 -> 设置为启动项目)。

在“调试”下的新项目选项页面上,将“启动操作”从“启动项目”设置为“启动外部程序”,然后在此处选择您的 fortran 可执行文件。再往下,选中“启用本机代码调试”选项。

要在 Visual Studio 中获得正确的构建顺序,请右键单击您的项目,选择“构建依赖项”->“项目依赖项”,然后勾选您的 fortran 应用程序。这可确保当您点击“开始调试”时,如果 fortran 应用程序过时,将首先构建。

很可能将任何其他类型的托管项目(VB.NET、C++/CLI、...)用作虚拟项目,但是,由于我的解决方案包含 C# 项目,因此我尚未对此进行测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 2011-07-29
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多