使用Code::Blocks设置编译MPI程序的MPICC.exe

3
我通过命令行在Windows上成功编译和运行了一款MPI程序,但是我现在想使用我的IDE code::blocks编译该程序,但却失败了。在设置 -> 编译器... -> 其他设置 -> 高级选项 -> 命令行宏下,我删除了所有不必要的标志,只留下了:$compiler $file。在设置 -> 编译器... -> 工具链可执行文件下,我只有用于C程序的MPI包装器mpicc.exe和用于C++的mpic++.exe。当我点击Build(Ctrl + F9)时,一个小弹窗会出现,显示:cl.exe - 应用程序错误 ,错误代码为0xc00000be。在code::blocks的构建日志窗口中,我得到了如下信息:
mpicc.exe C:\Entwicklung\src\mpi_prime.c
Skipping linking (no linker program set): C:\Entwicklung\src\mpi_prime.exe
Process terminated with status -1073741634 (1 minutes, 37 seconds) 0 errors, 0 warnings (1 minutes, 37 seconds)

我又卡住了,还有几个问题:

  1. 我应该保留mpicc.exe包装器吗?
  2. code::blocks总是尝试调用链接器等,我在哪里可以关闭它?
  3. 我一开始就想把编译器从cl改成gcc,我应该先尝试这个吗?

编辑 1:

mpicc.exe /nologo /W3  /MD /Ox /DNDEBUG    /IC:\Entwicklung\CUDA\VS2012~1\VC\include /IC:\Entwicklung\CUDA\VS2012~1\VC\include  /c main.c /Foobj\Release\main.obj
link.exe /nologo /LIBPATH:C:\Entwicklung\CUDA\VS2012~1\VC\include /LIBPATH:C:\Entwicklung\CUDA\VS2012~1\VC\include  /out:bin\Release\mpi_test_projektarbeit.exe "..\..\..\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\Kernel32.Lib" msvcrt.lib msvcprt.lib "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\Kernel32.Lib"  obj\Release\main.obj   
Process terminated with status -1073741634 (0 minutes, 1 seconds)
0 errors, 0 warnings (0 minutes, 1 seconds)
我相信我已经按照应该的方式设置了一切,但是我仍然收到了错误代码弹窗。我会尝试调整它。如果没有任何效果,我将尝试重新安装code::blocks,也许这会有所帮助。
编辑2: 首先,它仍然无法运行。 其次,我相信我现在对发生了什么以及出了什么问题有了更好的理解。
通过尝试不同的事情,我尝试直接使用cl.exe而不是mpicc.exe包装器。我选择了codeblocks提供的“设置->编译器...->Microsoft Visual C++ 2010”。尝试构建项目时,我收到了与“mpicc.exe”完全相同的错误消息(必须让我的noScript向我显示消息)。mpicc.exe在其“mpicc-wrapper-data.txt”清单中调用cl.exe。
因此,通过一些谷歌魔法,我在codeblocks论坛上找到了这个页面,在那里其他人也遇到了完全相同的错误消息。他们的建议是添加额外的环境路径,这让我想到了什么。在从命令行运行mpicc之前,我必须先运行vcvarsall.bat,因为我收到了一个错误,指出缺少mspdb110.dll。因此,我仔细查看了vcvarsall.bat,它调用另一个批处理文件vcvars32.bat。该文件临时添加了PATH变量。因此,我永久添加了C:\ Entwicklung \ CUDA \ VS 2012 \ Common7 \ IDE \到我的PATH,并且mpicc.exe可以被调用而没有任何缺少DLL错误消息,但尝试编译会显示一些链接器错误无法找到advapi32.lib。我将深入研究它,只要它在命令行上运行而不需要vcvars32.bat的帮助,我就会再次尝试CB。我希望这是导致所有问题的原因。
还有一件事让我有点困惑,虽然不严重,但是当我卸载CB并重新安装它时,CB在某个地方保存了“新”的mpi编译器设置。我检查了我的安装文件夹:卸载后所有文件都已删除,因此我还删除了USER \ AppData下的CB文件夹。但是,在安装CB时,编译器设置仍然存在于CB启动时,询问我是否要导入它们?

你是否正在使用OpenMPI 1.6.2(即最后一个本地Windows版本)? - Mike Kinghan
是的,确切地说是 OenMPI 1.6.2-win32。 - aldr
1个回答

3

这将帮助您使用OpenMPI Windows C编译器包装程序mpicc.exe,并在Code::Blocks(至少是12.11版本)中使用MS Visual Studio 10工具链(或更高版本)构建32位“Hello world”控制台项目:

我假设:

  • Code::Blocks已检测到MS VC++10编译器,并在下拉菜单选择的编译器下,在设置 -> 编译器中列出

  • 您已为MPI wrapper配置了新的编译器,比如说mpi,它是您更改了高级编译器设置和其他参数的那个

  • 您已在C:\Program Files (x86)\OpenMPI_v1.6.2-win32中安装了OpenMPI

然后:

要进行本地的win32构建,你需要链接kernel32.lib,并且你需要使用最新的Windows SDK,例如http://msdn.microsoft.com/en-US/windows/desktop/bg162891 在Code::Blocks IDE中,导航到Settings -> Compiler。选择mpi并删除该编译器(我们将重新开始)。
从下拉菜单中选择Microsoft Visual Studio 2010,然后点击Copy并再次命名新的编译器为mpi
在选项卡菜单中,切换到Toolchain executables选项卡,然后设置:
  • Compiler's installation directory = <empty>
  • C compiler = "C:\Program Files (x86)\OpenMPI_v1.6.2-win32\bin\mpicc.exe"
  • C++ compiler = "C:\Program Files (x86)\OpenMPI_v1.6.2-win32\bin\mpicc.exe"
  • 保留Toolchain executables中的其他设置,然后点击“OK”。
编译器将需要访问标准C库头文件(至少),并且需要无空格的(DOS)搜索路径。现在切换到Search Directories -> Compiler选项卡,在此处你将看到C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include
选择此路径,然后单击Edit并将其替换为相同的DOS版本,即C:\PROGRA~2\MICROS~1.0\VC\include
Compiler settings中退出。
接下来设置项目。
在导航到File -> New -> Project后,点击Console Application图标。
通过向导按以下步骤操作:
  • 设置language = C

  • 选择一个项目名称和位置

  • 设置Compiler = mpi

  • 完成

Code::Blocks会弹出一个警告,说在mpi的配置搜索路径中找不到编译器可执行文件(每当您访问项目的构建选项时也会这样)。这是一个误报。

  • Locate kernel32.lib under your SDK installation and get its pathname, say: "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\kernel32.lib"

  • Navigate Settings -> Project -> Build options and select Compiler = mpi

  • In the tab-menu, tab to Linker settings

  • Click Add beneath the Link libraries list. Add the full, quoted pathname you have noted for kernel32.lib and OK out of Build options.

  • Build the project. A successful build log should look like:

    -------------- Build: Debug in mpi_test (compiler: mpi)---------------
    
    "C:\Program Files (x86)\OpenMPI_v1.6.2-win32\bin\mpicc.exe" /nologo /W3  /MDd /Zi /D_DEBUG    /IC:\PROGRA~2\MICROS~1.0\VC\include  /c main.c /Foobj\Debug\main.obj
    main.c
    link.exe /nologo /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib"  /out:bin\Debug\mpi_test.exe msvcrtd.lib msvcprtd.lib "C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86\kernel32.lib"  obj\Debug\main.obj   /DEBUG 
    LINK : bin\Debug\mpi_test.exe not found or not built by the last incremental link; performing full link
    Output size is 17.50 KB
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 0 warnings (0 minutes, 0 seconds)
    

从这里开始,你可以转向一些真正的MPI项目,当然这需要配置额外的搜索目录和链接选项。

更新1:

我在您最新的构建日志中发现了一些问题:

  • 编译器被调用为mpicc.exe,但根据我的回答,应该通过完整路径名调用它,例如:"C:\Program Files (x86)\OpenMPI_v1.6.2-win32\bin\mpicc.exe"。你能否附上工具链可执行文件选项卡的截图?

  • 编译器选项/IC:\Entwicklung\CUDA\VS2012~1\VC\include出现了两次。这表明您已经全局配置了此选项的mpi编译器和项目。只需为项目进行配置即可。

  • 链接器选项/LIBPATH:C:\Entwicklung\CUDA\VS2012~1\VC\include也出现了两次,可能是同样的原因。但是,/LIBPATH:应指向包含库二进制文件(.lib)的目录,而您将其指向与CUDA头文件相同的位置-/IC:\Entwicklung\CUDA\VS2012~1\VC\include

  • kernel32.lib出现两次,第一次是相对路径"..\..\..\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\Kernel32.Lib",这可能无效,然后是绝对路径"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\Kernel32.Lib"。同样,这可能是由于结合多余或不正确的全局编译器配置和项目配置而导致的。

我建议你按照我给出的步骤使默认的“Hello World”控制台应用程序工作,并转向一个基本的MPI应用程序并使其工作,将需要的其他配置限制为项目而不是编译器


这是一个很好的答案,我相信我已经做了你建议的所有更改,但它还是不起作用。我编辑了我的原始帖子,并将尝试重新安装CodeBlocks。 - aldr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接