我试图用Windows上的openmpi编译mpi_prime.c。我尝试使用32位和64位版本的OpenMPI_v1.6.2。我得到了这些输出。
Microsoft (R) C/C++-Optimierungscompiler Version 17.00.61030 für x86 Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten. mpi_prime.c Microsoft (R) Incremental Linker Version 11.00.61030.0 Copyright (C) Microsoft Corporation. All rights reserved. /out:mpi_prime.exe /LIBPATH:C:\Entwicklung\OpenMPI_v1.6.2-x64/lib libmpi_cxx.lib libmpi.lib libopen-pal.lib libopen-rte.lib advapi32.lib Ws2_32.lib shlwapi.lib mpicxx mpi_prime.c Microsoft (R) C/C++-Optimierungscompiler Version 17.00.61030 für x86 Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten. mpi_prime.c Microsoft (R) Incremental Linker Version 11.00.61030.0 Copyright (C) Microsoft Corporation. All rights reserved. /out:mpi_prime.exe /LIBPATH:C:\Entwicklung\OpenMPI_v1.6.2-x64/lib libmpi_cxx.lib libmpi.lib libopen-pal.lib libopen-rte.lib advapi32.lib Ws2_32.lib shlwapi.lib mpi_prime.obj mpi_prime.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_MPI_Comm_rank" in Funktion "_main". mpi_prime.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_MPI_Comm_size" in Funktion "_main". mpi_prime.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_MPI_Finalize" in Funktion "_main". mpi_prime.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_MPI_Init" in Funktion "_main". mpi_prime.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_MPI_Reduce" in Funktion "_main". mpi_prime.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_MPI_Wtime" in Funktion "_main". mpi_prime.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ompi_mpi_comm_world" in Funktion "_main". mpi_prime.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ompi_mpi_op_max" in Funktion "_main". mpi_prime.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ompi_mpi_op_sum" in Funktion "_main". mpi_prime.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ompi_mpi_int" in Funktion "_main". mpi_prime.exe : fatal error LNK1120: 10 nicht aufgelöste Externe Microsoft (R) C/C++-Optimierungscompiler Version 17.00.61030 für x86 Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten. mpi_prime.c Microsoft (R) Incremental Linker Version 11.00.61030.0 Copyright (C) Microsoft Corporation. All rights reserved. /out:mpi_prime.exe /LIBPATH:C:\Entwicklung\OpenMPI_v1.6.2-win32/lib libmpi.lib libopen-pal.lib libopen-rte.lib advapi32.lib Ws2_32.lib shlwapi.lib mpi_prime.obj mpi_prime.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ompi_mpi_comm_world" in Funktion "_main". mpi_prime.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ompi_mpi_op_max" in Funktion "_main". mpi_prime.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ompi_mpi_op_sum" in Funktion "_main". mpi_prime.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_ompi_mpi_int" in Funktion "_main". mpi_prime.exe : fatal error LNK1120: 4 nicht aufgelöste Externe
编辑: Verweis aufnichtaufgelöstesexternes符号当然是“未解析的外部符号”
所以我猜这与使用错误的.dll的32位与64位库问题有关,因为32位版本似乎产生较少的冲突。
我的计划如下:
答案 0 :(得分:1)
Windows的二进制Open MPI发行版附带了一组DLL构建的库。提供的.lib
文件只是这些DLL的导入库。从DLL调用函数时,它们的原型必须携带__declspec(dllimport)
扩展存储类属性,以便允许编译器生成稍微不同的代码来调用这些函数或访问导出的变量。此外,dllimport
存储类属性的函数的名称前缀为_imp_
。没有dllimport
,例如对于MPI_Init
,编译器生成对_MPI_Init
符号的引用,而库实际导出_imp_MPI_Init
,因此导致未解析的符号错误。
由于Open MPI既可以编译为一组静态库,也可以编译为一组DLL,它使用简单的预处理器机制来处理具有一组头文件的两种情况(例如mpi.h
)。如果定义了预处理器符号OMPI_IMPORTS
,则所有MPI函数原型都会得到dllimport
处理,否则不会得到它。来自ORTE和OPAL框架的函数原型也是如此,相应的预处理器符号为ORTE_IMPORTS
和OPAL_IMPORTS
。
要使用二进制Open MPI发行版编译代码,您应该将OMPI_IMPORTS
添加到预处理程序定义列表中,该列表可以在项目的设置中找到:配置属性 - > C / C ++ - > 预处理器 - > 预处理器定义。