IT++是一个流行的 GPL 库(提议为 LGPL,但目前还没有迹象),用于科学计算,尤其是在电信领域。这是我的同事向我推荐的。
在我的 Linux/Windows 系统上安装这个库看起来很难。而且安装指南似乎很难。
除了花时间在这个安装上之外,我还有很多事情要做。任何人都可以通过一些快速安装为我节省一些时间,如果可能的话,一些你好,世界!输入指令?
$ wget https://sourceforge.net/projects/itpp/files/latest -O itpp.tar.bz2
$ tar -xjvf itpp.tar.bz2 && cd itpp-*
$ sudo apt-get install liblapack-dev libblas-dev libfftw3-dev
# Note: This is basic and recommended. MKL/ATLAS etc are
# platform-specialized, can give slightly better perf.
$ mkdir build1 build2
$ cd build1 # DYNAMIC (*.so file)
$ cmake ..
$ make
$ make install
$ cd bulid2 # STATIC (*.a file)
$ cmake .. -DITPP_SHARED_LIB=off
$ make
$ make install
# Note: The library installation is complete and is ready for both
# static and dynamic compilations. But the subsequent run of a
# *static compilation* is relatively more difficult, see details below.
IT++ 是一个强大的数值计算库,在通信理论研究人员中很受欢迎,提供与矩阵相关的构造。虽然其他相对较新的矩阵库 Eigen 等越来越受欢迎,但与 MATLAB 相比,它仍然因其美观优雅的界面而仍在使用。它还通过 Mex 例程提供与 MATLAB 的接口。我用它所有的时间。
不幸的是,即使安装说明看起来足够完整,但对于初学者来说还是很痛苦的,正如我在自己的同事中发现的那样。我认为的原因是它不适合初学者。我真诚地希望这篇文章能弥合差距。
我认为安装中混淆的主要来源是由于其对 BLAS、LAPACK 和 FFTW 的依赖关系,在可选的、供应商特定版本的 BLAS/LAPACK/FFTW (例如 MKL、ATLAS、ACML 库)旁边提到增加了实际要做的事情的混乱。
事实是,这些令人困惑的位中的大多数都是可选的!
我建议先尝试以下快速说明,然后忽略其他所有内容。
下载 IT++ 存档文件
$ wget https://sourceforge.net/projects/itpp/files/latest -O itpp.tar.bz2
提取和更改目录
$ tar -xjvf itpp.tar.bz2 && cd itpp-*
创建新的子目录“build1”和“build2”(我们将cd
在接下来的步骤中使用它们)
$ mkdir build1 build2
确保你有 LAPACK、BLAS、FFTW 库。顺便说一句,这不应该影响后期阶段。
$ sudo apt-get install liblapack-dev libblas-dev libfftw3-dev
这里有一个重要的警告:通常说更有效的选择是使用处理器的供应商特定库,例如Intel 的 MKL、AMD 的 ACML、ATLAS。但是这种效率是有代价的——您需要花费大量时间来注册(对于 MKL)、下载、安装,最后调整链接器开关以在每次编译和运行时包含它们。
主要安装步骤:
请执行以下两个步骤。没有坏处,而且我个人认为 IT++ 应该将两者都安装为默认选项。仅仅是因为,您永远不知道将来何时需要静态编译。这就是为什么几乎所有其他库都在您的 PC 上安装这两个版本的原因。
A.作为共享库 (*.so 文件)
$ cd build1
$ cmake ..
$ make
$ make install
B.作为静态库 (*.a 文件)
$ cd bulid2
$ cmake .. -DITPP_SHARED_LIB=off
$ make
$ make install
在 cmake 期间,您可能会遇到以下错误,但在成功运行单个 IT++ 程序之前,它们从未影响后期阶段。所以请忽略它们。将来,更高版本可能会将它们声明/更正为错误。当前版本是 4.3.1。
CMake Warning at CMakeLists.txt:192 (message):
BLAS library not found.
CMake Warning at CMakeLists.txt:196 (message):
LAPACK library not found.
CMake Warning at CMakeLists.txt:200 (message):
FFT library not found.
考虑下面的示例程序testITPP.cpp
#include<iostream>
using namespace std;
#include<itpp/itbase.h>
using namespace itpp;
int main()
{
vec x(100); // vec == Vec<double>
double y;
x=linspace(1,100,100);
y=sum(x);
cout<<"Hello, World! \n The sum of first 100 integers is: "<<y<<endl;
}
现在编译期间最重要的事情是-litpp
在所有文件之后始终使用 switch。
$ g++ testITPP.cpp -litpp $./a.out Hello, World! The sum of first 100 integers is: 5050
如果./a.out
产生错误,请运行sudo ldconfig
一次以刷新库缓存。
请注意,较早的编译默认使用共享库,并生成依赖于 PC 上太多其他二进制文件的二进制文件。即,上面的二进制文件a.out
不能在另一个没有安装 IT++ 的 unix 系统上运行,例如 这经常会产生问题,特别是在提交给大学集群和服务器的过程中,这允许用户执行繁重和长时间的计算。
一种解决方法是使用静态编译,摆脱所有本地依赖项。但这对初学者来说通常很困难。使用 MKL 类库下的 IT++,只知道如何进行静态编译真的很令人沮丧。一个很好的总结如何做加上我今天注意到的所有错误如下。
这是最简单的情况。需要注意两个特别重要的变化。一-litpp
变成-litpp_static
. 二、新的编译开关-static
。第一个是 IT++ 将二进制文件命名为 libitpp.so 和 libitpp_static.a 的奇怪选择的结果。
此外,与动态编译不同,静态编译可能必须包含 C++ 标准库(即 -lc 和 -lm)以外的所有库。这主要包括-lblas -llapack -lfftw -lpthread
和-ldl
。
因此,以下其中一项可能适用于您的情况:
$ g++ -static testITPP.cpp -litpp_static OR $ g++ -static testITPP.cpp -litpp_static -llapack -lblas -lpthread OR $ g++ sctest_PCCestimates.cpp -litpp_static \ -llapack -lblas -lgomp -lpthread \ -lgfortran -static -Wl,--allow-multiple-definition
虽然我还没有看到使用 MKL 的供应商特定库有多快,但静态编译可能真的很痛苦。MKL 本身的初始安装对我来说花了一个多小时。尽管确切的说明不适用于其他供应商库,但它应该让您为即将面临的实际挑战做好准备。
您遇到的错误消息无法理解以下大部分内容。结果,它们将非常烦人且难以解决。我试图在下面列出它们。希望他们能节省您大量宝贵的时间。
编译期间的循环依赖:前几个库可能需要用-Wl,--start-group .... -Wl,--end-group
.
对于特定于供应商的 blas/lapack/fftw,您可能需要在特定于供应商的库中搜索它们各自libblas.a
liblapack.a
libfftw.a
或等效项的位置。libmkl_core.a
必须使用开关提供目录位置-L/path/to/statics/
segmentation fault
即使在成功编译之后,也可能会遇到A。这个烦人问题的原因似乎libpthread.a
是没有完全包括在内。然后你需要强制采取适当的行动,将开关包围-lpthread
为-Wl,--whole-archive -lpthread -Wl,--no-whole-archive
最后,在 Ubuntu 16.04 上对我有用的版本是这个。请注意,没有-llapack -lblas -lfftw
etc,因为它们捆绑在不同命名的静态二进制文件下。
$ g++ -static \ -L/opt/intel/compilers_and_libraries/linux/mkl/lib/intel64_lin/ testITPP.cpp -Wl,--start-group \ -litpp_static \ -lmkl_intel_lp64 \ -lmkl_sequential \ -lmkl_core -Wl,--end-group \ -Wl,--whole-archive -lpthread -Wl,--no-whole-archive \ -ldl
最后,尽管您在上面成功生成了静态二进制文件,但您可能会收到警告说 warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
可能会出现但可以忽略,因为显然没有解决方案!这与一个众所周知的问题有关,我们不需要关心。
希望其他人会编写 Windows/Visual-Studio 安装指南。
我想你可能想要这样的东西?
sudo apt-get install libitpp-dev libitpp8v5
它正在使用基本的ubuntu安装过程。我正在使用 ubuntu 18.04 LTS。