如何单独编译Trilinos单个C++示例(Anasazi/Belos模块例程)
Trilinos单文件编译问题解答
直接用gcc -o test BlockCGEpetraExFile.cpp编译报错的原因
不能直接用裸gcc命令编译Trilinos例程,出现undefined reference是必然结果,命令缺失整套编译链接必须的参数:
- Trilinos是C项目,编译应当使用
g++而非gcc,后者默认不会自动链接C标准库,哪怕没有其他依赖也会报基础符号缺失。 - 命令没有指定Trilinos各模块的头文件搜索路径,预处理阶段就会找不到Epetra、Belos、Anasazi等组件的头文件。
- 链接阶段没有指定依赖的Trilinos库文件,也没有补上Trilinos依赖的MPI、BLAS、LAPACK等第三方库,少链接任意一个依赖项都会触发未定义引用报错。
- Trilinos默认启用MPI支持,绝大多数官方例程都需要MPI相关的编译链接参数,裸调gcc/g++基本都会漏这部分配置。
通用Trilinos单文件编译配置方案
不用手写冗余的路径、库列表配置,Trilinos安装完成后自带了配置导出工具,可以适配任意模块组合,支持单文件修改后快速编译,完全不需要重跑全量编译:
- 最轻量化的编译方式是直接调用Trilinos安装路径下bin目录的
trilinos-config脚本,它会自动输出指定模块对应的所有编译、链接参数,不需要手动维护依赖关系。比如编译Belos的BlockCG例程,直接执行以下命令即可:
g++ -o BlockCGTest BlockCGEpetraExFile.cpp `trilinos-config --cflags --libs Belos Epetra Teuchos`
命令末尾的模块名按需增删即可,比如编译Anasazi的BlockDavidson例程就把Belos替换成Anasazi,脚本会自动递归补全所有下层依赖(包括Teuchos核心组件、BLAS/LAPACK、MPI等第三方依赖)的参数,不会出现漏链问题。
- 如果习惯用Makefile,可以用下面的极简通用模板,不需要手动配置任何路径、库信息,只需要改两个变量就能适配不同例程:
# 通用Trilinos单文件编译Makefile # 待编译的源文件名(不带.cpp后缀) SRC = BlockCGEpetraExFile # 输出的可执行文件名 OUT = test # 用到的Trilinos模块列表,按需增删 TRILINOS_MODS = Belos Epetra Teuchos Anasazi CXX = g++ CXXFLAGS = `trilinos-config --cflags $(TRILINOS_MODS)` LDFLAGS = `trilinos-config --libs $(TRILINOS_MODS)` all: $(OUT) $(OUT): $(SRC).cpp $(CXX) -o $@ $< $(CXXFLAGS) $(LDFLAGS) clean: rm -f $(OUT)
如果编译Trilinos时启用了MPI支持,把上面Makefile里的CXX = g++换成CXX = mpicxx即可,兼容性更好。
- 如果你是直接在Trilinos源码构建目录下编译例程,不需要等全量编译完成,只要进入对应例程所在的子目录,执行
make 对应例程名(比如make BlockCGEpetraExFile),构建系统就会只编译该目标和它依赖的必要组件,不会编译整个项目,能节省大量时间。
内容的提问来源于stack exchange,提问作者Freya the Goddess
相关产品推荐
相关产品推荐

