cmakelist 库依赖库_【文档翻译】Medusa C++库——安装和构建
参考资料Coordinate Free Mehless Method implementatione6.ijs.siMedusa: Coordinate Free Mehless Method implementatione6.ijs.siProjects · E62 Laboratory / Medusagitlab.com地球物理局 地震波动力学实验室 无网格组 译目 录石中居士:【文档
参考资料
Coordinate Free Mehless Method implementatione6.ijs.si Medusa: Coordinate Free Mehless Method implementatione6.ijs.si Projects · E62 Laboratory / Medusagitlab.com地球物理局 地震波动力学实验室 无网格组 译
目 录
石中居士:【文档翻译】Medusa C++库——目录zhuanlan.zhihu.com
安装和构建
安装
在安装之前,参考:
石中居士:虚拟机中安装Ubuntu及后续配置zhuanlan.zhihu.com要想从原版Ubuntu安装开始,请运行:
sudo apt-get install git g++ python3 cmake libhdf5-serial-dev doxygen graphviz
git clone https://gitlab.com/e62Lab/medusa.git --branch master --single-branch
cd medusa
./run_tests.py
以上命令安装了依赖项、克隆了存储库、进入存储库的根文件夹并运行测试。这将构建并运行测试。如果这正常运作,您就可以开始了!否则,就安装任何丢失的包,如果仍然失败,请提出问题!
构建
依赖项列表:
- 构建工具:如cmake>=2.8.12、++>=4.8、make、python3
- 用于输入、输出的HDF5库
- doxygen>=1.8.8和Graphviz,用于生成文档
最好是源代码以外的版本。运行
mkdir -p build
cd build
cmake ..
make
注意,您只需要运行cmake一次,之后只需要用make就足够了。
二进制文件被放进bin/文件夹中。测试可以通过make medusa_run_tests一次性一并运行,或通过make operators_run_tests单独地运行。
链接器错误
在尝试不同的类时,您可能会遇到链接器错误,例如:
Scanning dependencies of target cantilever_beam [100%] Building CXX object
examples/linear_elasticity/CMakeFiles/cantilever_beam.dir/cantilever_beam.cpp.o [100%] Linking CXX executable
../../../examples/linear_elasticity/cantilever_beam /usr/bin/ld: CMakeFiles/cantilever_beam.dir/cantilever_beam.cpp.o: in function
`main': cantilever_beam.cpp:(.text.startup+0x162): undefined reference to `void mm::FindBalancedSupport::operator()
<mm::DomainDiscretization<Eigen::Matrix<double, 2, 1, 0, 2, 1> > >(mm::DomainDiscretization<Eigen::Matrix<double, 2, 1, 0, 2, 1> >&)
const' collect2: error: ld returned 1 exit status
这是预料之中的,而且也是编译时间优化的结果。实际上,可以通过两种方式引入medusa库:
#include <medusa/Medusa_fwd.hpp>
或者
#include <medusa/Medusa.hpp>
第一个版本包含所有符号的声明,但不是所有定义。包括了一些更常用的模板实例,但到目前为止还不是全部。使用未预编译的模板实例将导致程序编译良好,但由于缺少定义,将无法链接。在这种情况下,您有几个选择:包含完整的Medusa库(没有_fwd的头文件),它应该可以正常运作,但您将不得不等待更长的时间完成编译。只包含缺失的头文件(在上面的情况中,头文件为 medusa/bits/domains/FindBalancedSupport.hpp)并需要什么用什么。或者,将您的实例添加到已经预编译的实例中(位于.cpp文件中,如这个)。
HDF5
为了使用HDF5 IO,您需要使用HDF5库。您可以使用命令
sudo apt-get install libhdf5-dev
或
sudo pacman -S hdf5
来轻松安装它。
Ubuntu将HDFS头文件和库文件放在一个奇怪的文件夹 /usr/{lib, include}/x86_64-linux-gnu/hdf5/serial/ 中(至少在旧版本中是这样)。如果您在cmake执行期间,看到了这样一个错误:
HDF5 sample failed to compile. See errors above.
从而导致位于test/test_hdf_compile.cpp中的示例hdf测试文件编译失败。那么处理整个项目之前,或许最好先编译这个文件。
如果您得到这样一个错误,类似于
fatal error: hdf5.h: No such file or directory
那么编译器就无法看到HDF5头文件。一些发行版尤其是(较老的)Ubuntu,将它们放在非标准文件夹/usr/include/hdf5/serial/ 或 /usr/include/x86_64-linux-gnu/hdf5/serial/ 中。检查这两个文件夹或检查您的发行版hdf包中这些文件的位置。确定位置后,将该目录添加到include目录中,用 -I 标记或在CMakeLists.txt中,使用
include_directories(/usr/include/hdf5/serial/) # 或者你的合适目录
如果您希望一劳永逸解决这个问题,您可以在您的/usr/include目录中创建指向头文件的软链接,通过输入
sudo ln -s /usr/include/hdf5/serial/* /usr/include
之后,应该不会出现编译时间错误。如果还是有错误,请提出问题。
如果您得到类似于
-lhdf5 not found
的错误,而您已经安装了hdf5,您可能需要将库链接到一个可发现的位置,如/usr/lib/,或将上述目录添加到链接器路径。和上面类似,检查 /usr/lib/x86_64-linux-gnu/hdf5/serial/ 目录并寻找文件 libhdf5.a。找到以后,使用 -L标志指定位置,或者在CMakeList.txt中,使用
link_directories(/usr/lib/x86_64-linux-gnu/hdf5/serial/) # 或者你的合适目录
或者用软链接一劳永逸地解决这个问题
sudo ln -s /usr/lib/x86_64-linux-gnu/hdf5/serial/* /usr/lib
线性代数
我们使用Eigen作为我们的矩阵库。关于使用参考和文档,参见这里。根据Matlab的快速转换,参见这里。
安装Eigen,命令如下:
apt-get install libeigen3-dev
使用Intel数学内核库(MKL)
安装Intel MKL并不取安装目录。注册并下载MKL。
下载完后解压,运行install.sh。
进入install.sh所在目录,输入
bash install.sh
回车。进入安装界面。按照提示操作即可。
要使用Intel MKL,需要设置正确的包含目录和链接目录。
include_directories(SYSTEM /opt/intel/compilers_and_libraries/linux/mkl/include) # 改为你的安装路径
link_directories(SYSTEM /opt/intel/compilers_and_libraries/linux/mkl/lib/intel64)
link_directories(SYSTEM /opt/intel/compilers_and_libraries/linux/lib/intel64)
Eigen对MKL有很大的支持。您可以在他们的官网上看到更详细的说明。要将MKL用于数学操作,请在编译时定义EIGEN_USE_MKL_VML。您还必须链接适当的库,并定义MKL_LP64以便在64位系统上使用。启用并行性后,配置显示如下:
target_compile_options(my_target PRIVATE "-fopenmp")
target_compile_definitions(my_target PUBLIC EIGEN_USE_MKL_VML MKL_LP64)
target_link_libraries(my_target medusa mkl_intel_lp64 mkl_intel_thread mkl_core pthread iomp5)
如果您安装了Intel Parallel Studio,这也使您能够通过其Eigen界面使用Pardiso paralle直接稀疏求解器。
使用Intel C/C++编译器
为了在编译Medusa时使用Intel的编译器,对于cmake您有几个标准选项。确保编译器和并通过运行which icc来使其安装在您的PATH中,它应该返回类似于/opt/intel/bin/icc的内容。
你可以当“第一次”调用cmake时定义编译器如下:
cmake .. -DCMAKE_C_COMPILER=$(which icc) -DCMAKE_CXX_COMPILER=$(which icpc)
如果这不是您的第一次调用,请删除build目录并重新开始。
您还可以设置 CXX 和 CC bash变量。在第一次调用cmake之前,您必须导出以下内容:
export CXX="icpc"
export CC="icc"
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)