我们有一个HPC环境,其中包含大多数软件包的多个版本,因此我们设计了一种自制的方式来在独特的位置安装软件包,并为程序员/研究人员使用环境模块,以便能够在构建程序,运行程序或两者时使用哪些库版本。有没有一种相对轻松的方法可以在这种环境中执行构建。就我而言,我们在构建犰狳时使用OpenBLAS,ARPACK,LAPACK和SuperLU。就我而言,我正在拍摄犰狳-0.3.7。如果在./configure
和make
天内使用开关可以工作,那就太好了。但到目前为止,我发现的只是CMake
构建,而且进行构建似乎并不简单。
哦,是的。而且,顺便说一下,输出的犰狳库需要是静态的。
提前感谢您的帮助。最初的问题可能有点模糊,但我可以随心所欲地具体。我只是不想为这个问题的最初问题写小说。
现在存在工具来处理这些科学软件构建的复杂性。我建议你看看Spack或EasyBuild。此类工具将通过自动构建所有必需的依赖项并生成模块文件供用户使用构建的软件来帮助您节省大量时间。
可以修改CMakeList.txt
文件和其他与 CMake 相关的文件以满足您的需求。标志在第 48+ 行定义,例如set(ARMA_USE_LAPACK false)
然后,在第 250 行的include(ARMA_FindLAPACK)
中定义与 LAPACK 库相关的变量。如果找到 lapack,则在第 347 行切换中的标志。
LAPACK 所在的自定义路径可以在文件 cmake_aux/ARMA_FindLAPACK.cmake 中指定。如果您的自定义路径存储为环境变量export PATHLAPACKLIB=/usr/lib/openblas-base
,则可以通过修改第 11 行在 ARMA_FindLAPACK.cmake 文件中使用它(请参阅如何在 CMake (Windows( 和FIND_LIBRARY()
中检索用户环境变量(:
message("Searching Lapack in $ENV{PATHLAPACKLIB}")
FIND_LIBRARY(LAPACK_LIBRARY
NAMES ${LAPACK_NAMES}
HINTS $ENV{PATHLAPACKLIB}
NO_DEFAULT_PATH
)
它不是 CMakefile 的漂亮修改,因为它使它不可移植,因为它的结果取决于环境变量。但是,如果您打算一劳永逸地构建和安装犰狳,它可以工作。请记住,每次修改 CMakeFile.txt 时都要删除 CMakeCache.txt 文件,否则它会保留以前运行的cmake .
的一些跟踪,并且看起来修改是无关紧要的。
若要使库成为静态库,请将关键字 static 添加到 CMakeFile.txt 第 514 行的命令add_library()
中,如 CMake - 创建静态库中所示:
add_library( armadillo STATIC ...)
运行cmake .
然后make
创建一个小的armadillo.a文件,因为大多数源代码都包含在cpp标头中。 最后,示例 1 编译为:
g++ -O2 -std=c++11 example1.cpp -o example1 -larmadillo -L/home/...../softs/armadillo-9.800.3/armadillo-9.800.3 -I/home/...../softs/armadillo-9.800.3/armadillo-9.800.3/include -lopenblas