首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OS上编译PETSc示例时出错

在OS上编译PETSc示例时出错
EN

Stack Overflow用户
提问于 2017-08-11 21:06:34
回答 1查看 362关注 0票数 1

这是hello.cpp。我在OS上,我直接从源代码构建了PETSc。

代码语言:javascript
复制
#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

代码语言:javascript
复制
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)

产额

代码语言:javascript
复制
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++,我正在这样做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-11 23:19:24

实际上,您还没有针对库文件进行链接,只告诉编译器库目录。为了正确链接,您需要执行-lPetsc或任何调用文件的操作。

编辑:在OSX上,除非你特别安装,否则你也不使用gcc。gcc/g++正在使用clang,除非你自己去安装它。您甚至可以在编译器输出中看到这一点。

编辑2:我用以下代码编译了示例代码:

代码语言:javascript
复制
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,所以我也为此添加了库(-lmpi)

一般规则用于计算在OS中链接的内容:

  1. locate你想要的图书馆在终端机。这将为您提供您需要的目录路径。如果您以前从未使用过此命令,它将在第一次运行时构建一个locate数据库。
  2. 转到库目录,您将看到一堆.dylib或.as或其他东西。它们通常以开头。这意味着移除库,所需的精确-l命令是-l(remainingname)。我希望这对未来有帮助。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45643771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档