2016-09-09 18 views
1

私はparmetis-4.0.3をビルドしてインストールし、それをテストする簡単なコードを書いています。私はCコードがあるParMETIS: `ParMETIS_V3_PartMeshKway 'への未定義の参照

"ParMETIS_V3_PartMeshKway '`に未定義の参照を":

#include <iostream> 
#include "parmetis.h" 

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

    MPI_Init(&argc, &argv); 

    int np = 3; int ne = 36; 

    idx_t *elmdist = new idx_t[np+1]; for (int i=0; i<np+1; i++) {elmdist[i] = (i-1)*ne/np;} elmdist[np] = ne; 

    idx_t *eptr = new idx_t[ne+1]; for (int i=0; i<ne+1; i++) {eptr[i] = (i-1)*3;} 

    idx_t eind_[] = {13, 14, 15, 
      13, 16, 17, 
      2, 17, 6, 
      4, 15, 10, 
      13, 15, 19, 
      13, 17, 18, 
      13, 19, 16, 
      13, 18, 14, 
      1, 5, 16, 
      3, 9, 14, 
      7, 8, 18, 
      11, 12, 19, 
      1, 20, 12, 
      3, 21, 8, 
      7, 18, 23, 
      11, 19, 22, 
      2, 23, 17, 
      4, 22, 15, 
      14, 25, 15, 
      16, 24, 17, 
      15, 22, 19, 
      17, 23, 18, 
      1, 16, 20, 
      3, 14, 21, 
      5, 24, 16, 
      9, 25, 14, 
      16, 19, 20, 
      14, 18, 21, 
      6, 17, 24, 
      10, 15, 25, 
      5, 6, 24, 
      9, 10, 25, 
      8, 21, 18, 
      12, 20, 19, 
      2, 7, 23, 
      4, 11, 22}; 
    idx_t *eind = eind_; 

    idx_t *elmwgt = NULL; 

    idx_t wgtflag_[] = {0}; 
    idx_t *wgtflag = wgtflag_; 

    idx_t numflag_[] = {0}; 
    idx_t *numflag = numflag_; 

    idx_t ncon_[] = {1}; 
    idx_t *ncon = ncon_; 

    idx_t ncommonnodes_[] = {2}; 
    idx_t *ncommonnodes = ncommonnodes_; 

    idx_t nparts_[] = {np}; 
    idx_t *nparts = nparts_; 

    real_t *tpwgts = new real_t[np*ncon[0]]; for(int i=0; i<np*ncon[0]; i++) {tpwgts[i] = 1.0/np;} 

    real_t ubvec_[] = {1.05}; 
    real_t *ubvec = ubvec_; 

    idx_t options_[] ={0, 0, 0}; 
    idx_t *options =options_; 

    idx_t *edgecut=NULL; 

    idx_t *part=NULL; 

    MPI_Comm *comm=NULL; 

    ParMETIS_V3_PartMeshKway(elmdist, eptr, eind, elmwgt, wgtflag, numflag, ncon, ncommonnodes, nparts, tpwgts, ubvec, options, edgecut, part, comm); 

    MPI_Finalize(); 
    return 0; 
} 

私が持っているメイクファイルは次のとおりです。

ParMETIS_INCLUDES = ${cpp_libraries}/parmetis/include 
METIS_INCLUDES = ${cpp_libraries}/metis/include 

INCLUDES = -I${ParMETIS_INCLUDES} -I${METIS_INCLUDES} 
LFLAGS = -L${ParMETIS_INCLUDES} -L${METIS_INCLUDES} 

CC = mpic++ 

parmetis_try: parmetis_try.cpp 
    ${CC} -Wall -g $(INCLUDES) -o parmetis_try.out parmetis_try.cpp $(LFLAGS) 

clean: 
    rm *.o *.out *~ 

私が入力した場合しかし、私はというエラーを取得していますコマンドラインにmakeと入力すると、次のエラーメッセージが表示されます。

mpic++ -Wall -g -I/l/yangsong/Library/parmetis/include -I/l/yangsong/Library/metis/include -o parmetis_try.out parmetis_try.cpp -L/l/yangsong/Library/parmetis/include -L/l/yangsong/Library/metis/include 
/tmp/ccmrGrI2.o: In function `main': 
/l/yangsong/Simulation/VTURP/depreciated/parmetis_try/parmetis_try.cpp:85: undefined reference to `ParMETIS_V3_PartMeshKway' 
collect2: error: ld returned 1 exit status 
make: *** [parmetis_try] Error 1 

私はおそらく私は正常にparmetisをインストールしていないと思った。しかし、.cppファイルのParMETIS_V3_PartMeshKwayという行をコメントアウトすると、正常にコンパイルされます。また、nm parmetis/lib/libparmetis.so | grep Kwa | grep Mesと入力すると、次のように表示されます。

000000000001b570 T libparmetis__CheckInputsPartMeshKway 
0000000000013e80 T ParMETIS_V3_PartMeshKway 

したがって、parmetisは正常にインストールされていると思います。なぜこのエラーメッセージが表示されるのですか?

答えて

2

私はwrittingメイクファイルの専門家ではありませんが、あなたのエラーはこのファイルから来ていると思います。私が正しければ、あなたはmetisとリンクすることを忘れてしまいます。さらに、-Lフラグはライブラリディレクトリを与えます。私はpar_metisのlibがインクルードフォルダにないと思います。

私はMETISと自分でメイクファイルを再構築し、それがそのように動作します:

all: metis 

main.o: main.cpp 
    clang++ -Wall -I/usr/local/include -c main.cpp 

metis: main.o 
    clang++ -Wall main.o -o metis -L/usr/local/lib -lmetis 

私はメイクの専門家ではないと私はメイクファイルの上にCMakeのを好む誤差源の多くは、自分のしているので。このpostでは私はcmakeの例を挙げます。 metisをparmetisライブラリに置き換えるのは簡単です。 メスで答えがあなたと幸運を助けることを願っています! :)

+0

あなたが正しいです、私は最後にいくつかの旗が欠けていました。私はlibparmetis.aとlibmetis.aへのパスを提供するときに動作します – Yang

関連する問題