【问题标题】:Error compiling PETSc example on OS X在 OS X 上编译 PETSc 示例时出错
【发布时间】:2017-08-11 21:06:34
【问题描述】:

这里是 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++,我正在这样做。

【问题讨论】:

    标签: c++ macos petsc


    【解决方案1】:

    您实际上并没有链接库文件,只是告诉编译器有关库目录的信息。您需要执行 -lPetsc 或调用任何文件才能正确链接。

    编辑:在 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)

    在 OS X 中确定链接对象的一般规则

    1. locate 终端中你想要的库。这为您提供了您需要的目录路径。如果您以前从未使用过此命令,它将在第一次运行时构建一个定位数据库。

    2. 转到库目录,您会看到一堆 .dylib 或 .as 或其他文件。它们通常以 lib 开头。这意味着您删除了库,而您需要的精确的-l 命令是-l(remainingname)。我希望这对未来有所帮助。

    【讨论】:

    • 我的 C++-Fu 很弱。我添加了LIBS=-L$(PETSC_LIB_DIR) -l$(PETSC_LIB_DIR)/libpetsc.dylib,我得到了ld: library not found for -l/usr/local/Cellar/petsc/3.7.6_3/lib/libpetsc.dylib(现在使用地窖库)这是因为它想要.a吗?
    • 试试 -lpetsc。编译器将在您指定的 -L 文件夹中查找库。
    • 非常感谢!我现在想撤退到 Python 和 Chapel……
    猜你喜欢
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多