【问题标题】:mpi compiling warning implicit declarationmpi 编译警告隐式声明
【发布时间】:2018-02-23 01:03:43
【问题描述】:

今天我在 mi mac 10.9 上安装 mpi 和 home-brew mpicc 与 simlpe hello world 程序一起工作,但如果我尝试这样的事情

#include <mpi.h>
#include <string.h>
#include <stdio.h>
#define max 1000

int main(int argv, char *argc[]){


    int myrank,nProc,tag,j;
    char buff [max];
    MPI_Status status;
    tag=0;
    MPI_Init(&argv,&argc);
    MPI_Comm_Rank(MPI_COMM_WORLD,&myrank);
    MPI_Comm_Size(MPI_COMM_WORLD,&nProc);

    if(myrank==0){
    for(j =1 ; j<nProc;j++){
    MPI_Recv(&buff,max,MPI_CHAR,j,tag,MPI_COMM_WORLD,&status);
    printf("Il processo %d dice di chiamarsi %s\n",j,buff);
    }

                }
                else{
                switch (myrank){
                case 1 :
                 MPI_Send("Franco",max,MPI_CHAR,j,tag,MPI_COMM_WORLD);
                 break;
                 case 2 :
                 MPI_Send("Mena",max,MPI_CHAR,j,tag,MPI_COMM_WORLD);
                 break;
                 case 3 :
                 MPI_Send("Nino",max,MPI_CHAR,j,tag,MPI_COMM_WORLD);
                 break;
                                }
                    }
    printf("Ciao da %d \n",myrank);
    MPI_Finalize();
    return(0);
                               }

我尝试在下面一行编译它:

mpicc -o filename filename.c

它给了我这个警告而不是构建。

nucciampi.c:15:3: warning: implicit declaration of function 'MPI_Comm_Rank' is
      invalid in C99 [-Wimplicit-function-declaration]
                MPI_Comm_Rank(MPI_COMM_WORLD,&myrank);
                ^
nucciampi.c:16:3: warning: implicit declaration of function 'MPI_Comm_Size' is
      invalid in C99 [-Wimplicit-function-declaration]
                MPI_Comm_Size(MPI_COMM_WORLD,&nProc);
                ^
2 warnings generated.
Undefined symbols for architecture x86_64:
  "_MPI_Comm_Rank", referenced from:
      _main in nucciampi-zsehoq.o
  "_MPI_Comm_Size", referenced from:
      _main in nucciampi-zsehoq.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

请帮我解决这个问题!!!

【问题讨论】:

  • MPI 中使用的命名约定是MPI_Capital_then_all_lowercase

标签: c compiler-construction mpi linker-errors


【解决方案1】:

MPI_Comm_Rank -> MPI_Comm_rank

MPI_Comm_Size -> MPI_Comm_size

【讨论】:

  • Hristo 的回答实际上在这里更完整。
【解决方案2】:

MPI 中的所有例程和常量都有一个明确定义的命名约定,并在 MPI 规范的 §2.2 中进行了描述:

在 C 中,与特定类型的 MPI 对象关联的所有例程都应采用 MPI_Class_action_subset 的形式,或者,如果不存在子集,则采用 MPI_Class_action 的形式。在 Fortran 中,与特定类型的 MPI 对象关联的所有例程都应采用 MPI_CLASS_ACTION_SUBSET 的形式,或者,如果不存在子集,则采用 MPI_CLASS_ACTION 的形式。对于 C 和 Fortran,我们使用 C++ 术语来定义 Class。在 C++ 中,例程是Class 上的一个方法,名为MPI::Class::Action_subset。如果例程与某个类关联,但作为对象方法没有意义,则它是该类的静态成员函数。

请注意,与 Fortran 不同,C 中的符号名称区分大小写。

【讨论】:

    猜你喜欢
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    相关资源
    最近更新 更多