在 OS X 上编译 PETSc 示例时出错
Error compiling PETSc example on OS X
这里是hello.cpp。我在 OS X 上。我直接从源代码构建了 PETSc。
#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;
}
这是我的 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)
产生
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
看来库链接正确。关于这个话题的很多讨论都说尝试使用 g++,我正在这样做。
您实际上并没有link修改库文件,只是告诉编译器有关库目录的信息。您需要执行 -lPetsc 或调用任何文件才能正确 link 。
编辑:在 OSX 上,您也没有使用 gcc,除非您专门安装了它。 gcc/g++ 正在使用 clang,除非你自己去安装它。您甚至可以在编译器输出中看到这一点。
编辑 2:我使用以下代码编译了您的示例代码:
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
所以,正如我所说,你错过了 -lpetsc
。添加此标志后,我发现 petsc 需要 Open-MPI,因此我也为此添加了库 (-lmpi
)
一般规则 用于计算您 link 在 OS X:
中反对的内容
locate
终端中你想要的库。这为您提供了所需的目录路径。如果您以前从未使用过此命令,它将首先在 运行 上建立一个定位数据库。
转到库目录,您会看到一堆.dylib 或.as 或其他内容。他们通常 从一个库开始。这意味着您删除了库,您需要的精确 -l
命令是 -l(remainingname)
。我希望这对未来有所帮助。
这里是hello.cpp。我在 OS X 上。我直接从源代码构建了 PETSc。
#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;
}
这是我的 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)
产生
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
看来库链接正确。关于这个话题的很多讨论都说尝试使用 g++,我正在这样做。
您实际上并没有link修改库文件,只是告诉编译器有关库目录的信息。您需要执行 -lPetsc 或调用任何文件才能正确 link 。
编辑:在 OSX 上,您也没有使用 gcc,除非您专门安装了它。 gcc/g++ 正在使用 clang,除非你自己去安装它。您甚至可以在编译器输出中看到这一点。
编辑 2:我使用以下代码编译了您的示例代码:
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
所以,正如我所说,你错过了 -lpetsc
。添加此标志后,我发现 petsc 需要 Open-MPI,因此我也为此添加了库 (-lmpi
)
一般规则 用于计算您 link 在 OS X:
中反对的内容locate
终端中你想要的库。这为您提供了所需的目录路径。如果您以前从未使用过此命令,它将首先在 运行 上建立一个定位数据库。转到库目录,您会看到一堆.dylib 或.as 或其他内容。他们通常 从一个库开始。这意味着您删除了库,您需要的精确
-l
命令是-l(remainingname)
。我希望这对未来有所帮助。