かなり初歩的な質問ですが、今は本当に迷っています。私は PETSc から始めていますが、コードのコンパイルに問題があります。独自の Makefile を使用しようとしていますが、コンパイラは「未定義の参照」エラーを叫び続けます。私は数時間自分でそれを理解しようとしましたが、間違いがわかりません。そのため、間違いを認識していただける場合は、ご協力をお願いいたします。
これはエラーメッセージ全体です:
mpicc petscLUFact.o -L/home/martin/petsc-3.5.2/arch-linux2-c-debug/lib
petscLUFact.o: In function `main':
/home/martin/Dokumenty/Programovani/petscLUFact.c:18: undefined reference to `PetscInitialize'
/home/martin/Dokumenty/Programovani/petscLUFact.c:20: undefined reference to `PETSC_COMM_WORLD'
/home/martin/Dokumenty/Programovani/petscLUFact.c:20: undefined reference to `MatCreate'
/home/martin/Dokumenty/Programovani/petscLUFact.c:21: undefined reference to `MatSetSizes'
/home/martin/Dokumenty/Programovani/petscLUFact.c:22: undefined reference to `MatSetFromOptions'
/home/martin/Dokumenty/Programovani/petscLUFact.c:23: undefined reference to `MatMPIAIJSetPreallocation'
/home/martin/Dokumenty/Programovani/petscLUFact.c:24: undefined reference to `MatGetOwnershipRange'
/home/martin/Dokumenty/Programovani/petscLUFact.c:26: undefined reference to `MatDestroy'
/home/martin/Dokumenty/Programovani/petscLUFact.c:28: undefined reference to `PetscFinalize'
/home/martin/Dokumenty/Programovani/petscLUFact.c:20: undefined reference to `PetscError'
/home/martin/Dokumenty/Programovani/petscLUFact.c:24: undefined reference to `PetscError'
/home/martin/Dokumenty/Programovani/petscLUFact.c:23: undefined reference to `PetscError'
/home/martin/Dokumenty/Programovani/petscLUFact.c:22: undefined reference to `PetscError'
/home/martin/Dokumenty/Programovani/petscLUFact.c:21: undefined reference to `PetscError'
collect2: error: ld returned 1 exit status
make: *** [petscLUFact] Error 1
これは私の .c ファイルです。まだ完成していません。ただのテストです。
static char help[] = "Reads a PETSc matrix and vector from a file and reorders it.\n\
-f0 <input_file> : first file to load (small system)\n\
-f1 <input_file> : second file to load (larger system)\n\n";
#include <petscsys.h>
#include <petscmat.h>
int main( int argc, char **args ) {
Mat A; // matice
//IS isrow,iscol; // permutace radku a sloupcu
PetscInt r = 5, c = 5; // rozmery matice
PetscInt i,j; // souradnice v matici
PetscInt Istart, Iend;
PetscInt Ii; // pocitadlo
PetscScalar v; // 2-rozmerne pole ???
PetscErrorCode ierr;
PetscInitialize( &argc, &args, (char*)0, help );
ierr = MatCreate( PETSC_COMM_WORLD, &A );CHKERRQ( ierr );
ierr = MatSetSizes( A, PETSC_DECIDE, PETSC_DECIDE, r*c, r*c );CHKERRQ(ierr);
ierr = MatSetFromOptions(A);CHKERRQ(ierr);
ierr = MatMPIAIJSetPreallocation( A, 5, PETSC_NULL, 5, PETSC_NULL );CHKERRQ(ierr);
ierr = MatGetOwnershipRange(A,&Istart,&Iend);CHKERRQ(ierr);
MatDestroy(&A);
PetscFinalize();
return 0;
}
ここに私のメイクファイルがあります:
include ${PETSC_DIR}/conf/variables
include ${PETSC_DIR}/conf/rules
CFLAGS=-I${PETSC_DIR}/include -I${PETSC_DIR}/${PETSC_ARCH}/include
petscLUFact: petscLUFact.o
mpicc petscLUFact.o -L${LD_LIBRARY_PATH}
petscLUFact.o: petscLUFact.c
mpicc ${CFLAGS} -c petscLUFact.c -o petscLUFact.o
$PETSC_DIR/include
には${PETSC_DIR}/${PETSC_ARCH}/include
、petsc ヘッダー (.h) ファイルが配置されています。
システム変数の値は次のとおりです。
$PETSC_DIR=/home/martin/petsc-3.5.2
$PETSC_ARCH=arch-linux2-c-debug
$LD_LIBRARY_PATH=/home/martin/petsc-3.5.2/arch-linux2-c-debug/lib
そして、これは私の LD_LIBRARY_PATH フォルダーの構造です:
arch-linux2-c-debug/lib
├── libpetsc.a
├── libpetsc.so -> libpetsc.so.3.5.2
├── libpetsc.so.3.5 -> libpetsc.so.3.5.2
├── libpetsc.so.3.5.2
├── modules
│ └── 3.5.2-arch-linux2-c-debug
└── pkgconfig
└── PETSc.pc