2014-10-21 9 views
1

나는 꽤 초보자가 질문을하지만, 나는 정말로 잃어버린다. PETSc로 시작했지만 코드 컴파일에 문제가 있습니다. 내 자신의 Makefile을 사용하려고하지만 컴파일러는 "정의되지 않은 참조"오류를 계속 울립니다. 몇 시간 동안 나 혼자서 알아 내려고 노력했지만, 실수를 보지 못했습니다. 따라서 실수를 인식하면 도움을 크게 받으실 수 있습니다.PETSc 정의되지 않은 참조

이 전체 오류 메시지입니다 :

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 
+0

정의되지 않은 참조 오류로 인해 기준에 가능성이 높습니다 소스 코드에서. 관련 소스 코드와 완전한 오류 메시지를 포함 시키십시오. 오류 메시지는 정확히 어떤 기호가 발견되지 않았 음을 나타냅니다. – user3629249

+0

필요한 정보를 추가했습니다 :-) – Eenoku

+4

실제로 라이브러리를 링커 (또는이 경우에는'mpicc' 명령?)에 전달하고 있습니까? 거기에'-lpetsc'가 필요합니다. L '깃발 –

답변

1

(. 의견 및 편집의 답변을 참조하십시오 Question with no answers, but issue solved in the comments (or extended in chat))

@Wesley Bland는 다음과 같이 썼습니다 :

실제로 라이브러리를 링커에 전달하고 있습니까 (이 경우 mpicc 명령? -L<stuff> 깃발 외에도 -lpetsc 명이 필요합니다.

내가 Makefile-lpetsc 플래그를 추가, 그래서 지금은 다음과 같습니다 :

영업 이익은 쓴

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 -o petscLUFact -L${LD_LIBRARY_PATH} -lpetsc 

petscLUFact.o: petscLUFact.c 
    mpicc ${CFLAGS} -c petscLUFact.c -o petscLUFact.o