2017-08-11 4 views
1

Voici hello.cpp. Je suis sur OS X. J'ai construit PETSc directement à partir de la source.Erreur lors de la compilation de l'exemple PETSc sous OS X

#include <petscvec.h> 

int main(int argc,char **argv) 
{ 
Vec x; 
PetscInitialize(&argc, &argv, NULL, NULL); 
VecCreateSeq(PETSC_COMM_SELF, 100, &x); 
VecSet(x, 1.); 
PetscFinalize(); 
return 0; 
} 

Et voici mon makefile

PETSC_BASE_DIR=/Users/buddha/src/petsc 
PETSC_LIB_DIR=${PETSC_BASE_DIR}/lib 
PETSC_INCLUDE_DIR=${PETSC_BASE_DIR}/include 

INCLUDES=$(PETSC_INCLUDE_DIR) 
LIBS=$(PETSC_LIB_DIR) 

CC=g++ 
EXEC=oy 
ARGS=-Wall -lstdc++ 
CPP=hellp.cpp 
#CPP=oy.cpp 

all: hello.cpp 
    $(CC) $(ARGS) -I$(INCLUDES) -L$(LIBS) -o $(EXEC) $< 

clean: 
    rm $(EXEC) 

run: 
    ./$(EXEC) 

qui donne

make 
g++ -Wall -lstdc++ -I/Users/buddha/src/petsc/include 
    -L/Users/buddha/src/petsc/lib -o oy hello.cpp 
Undefined symbols for architecture x86_64: 
"_PetscFinalize", referenced from: 
    _main in hello-924d8b.o 
"_PetscInitialize", referenced from: 
    _main in hello-924d8b.o 
"_VecCreateSeq", referenced from: 
    _main in hello-924d8b.o 
"_VecSet", referenced from: 
    _main in hello-924d8b.o 
"_ompi_mpi_comm_self", referenced from: 
    _main in hello-924d8b.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [all] Error 1 

Il semble que la bibliothèque est un lien correctement. Une grande partie du bavardage à propos de ce sujet dit d'essayer d'utiliser g ++, ce que je fais.

Répondre

2

Vous n'avez pas réellement lié au fichier de bibliothèque, seulement dit le compilateur au sujet du répertoire de bibliothèque. Vous devrez faire -lPetsc ou quel que soit le nom du fichier pour pouvoir lier correctement. Edit: Sous OSX, vous n'utilisez pas gcc à moins que vous ne l'installiez spécifiquement. gcc/g ++ utilise clang sauf si vous allez l'installer vous-même. Vous pouvez même voir cela dans la sortie du compilateur.

Edit 2: Je compilé votre exemple de code avec les éléments suivants:

clang++ petsc.cpp -L/usr/local/Cellar/petsc/3.7.6_3/lib 
-I/usr/local/Cellar/petsc/3.7.6_3/include -lpetsc 
-L/usr/local/Cellar/open-mpi/2.1.1/lib -lmpi 

Alors, comme je l'ai dit, vous manquez -lpetsc. Lors de l'ajout de ce drapeau, j'ai trouvé que PETSc nécessaire Ouvrez-MPI, alors j'ai ajouté la bibliothèque pour cela aussi (-lmpi)

La règle générale pour travailler ce que vous liez contre dans OS X:

  1. locate la bibliothèque que vous voulez dans le terminal. Cela vous donne le chemin de votre répertoire dont vous aurez besoin. Il construira une base de données de localisation à la première exécution si vous n'avez jamais utilisé cette commande auparavant.

  2. Accédez au répertoire de la bibliothèque et vous verrez un tas de .dylib ou .as ou quoi que ce soit. Ils habituellement commencent par un lib. Cela signifie que vous supprimez la lib, et la commande précise -l dont vous avez besoin est -l(remainingname). J'espère que cela aidera pour l'avenir.

+0

Mon C++ - Fu est faible. J'ai ajouté 'LIBS = -L $ (PETSC_LIB_DIR) -l $ (PETSC_LIB_DIR)/libpetsc.dylib' et j'obtiens' ld: bibliothèque introuvable pour -l/usr/local/Cellar/petsc/3.7.6_3/lib/libpetsc.dylib' (utilise maintenant les librairies Cellar) Est-ce parce qu'il veut un '.a'? –

+1

Essayez juste -lpetsc. Le compilateur recherchera la bibliothèque dans le dossier -L que vous avez spécifié. –

+0

Merci beaucoup! Je veux retraiter à Python et à la Chapelle maintenant ... –