“_ompi_mpi_int”在Funktion“_main”LNK2019中

时间:2014-01-15 18:49:55

标签: linker linker-errors openmpi

我试图用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位版本似乎产生较少的冲突。

我的计划如下:

  1. 让它在32位上运行 - >我现在在这里
  2. 让它在64位上运行
  3. 让它与其他编译器一起运行,例如gcc
  4. 使用我的IDE代码块运行

1 个答案:

答案 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_IMPORTSOPAL_IMPORTS

要使用二进制Open MPI发行版编译代码,您应该将OMPI_IMPORTS添加到预处理程序定义列表中,该列表可以在项目的设置中找到:配置属性 - > C / C ++ - > 预处理器 - > 预处理器定义