在 Ubuntu 上安装 C++ 软件包

在 Ubuntu 上安装 C++ 软件包

我目前正在运行 Ubuntu 20.04.2 LTS。

我正在尝试安装 C++ 包 Linbox (https://linalg.org/)。我尝试使用 apt-get install 在 ubuntu 上安装它,因此我执行以下操作:

sudo apt-get install liblinbox-dev
sudo apt-get install libgivaro-dev
sudo apt-get install fflas-ffpack

由于 givaro 和 fflas-ffpack 是 linbox 所需的包。当我尝试编译示例文件调用 rank.cpp 时,出现错误:

In file included from /usr/include/linbox/field/hom.h:37,
                 from /usr/include/linbox/matrix/densematrix/blas-matrix.h:43,
                 from /usr/include/linbox/matrix/dense-matrix.h:79,
                 from /usr/include/linbox/matrix/matrixdomain/blas-matrix-domain.h:51,
                 from /usr/include/linbox/matrix/matrix-domain.h:68,
                 from /usr/include/linbox/matrix/sparsematrix/sparse-generic.h:80,
                 from /usr/include/linbox/matrix/sparse-matrix.h:70,
                 from rank.cpp:40:
/usr/include/linbox/ring/ntl/ntl-zz.h:33:10: fatal error: NTL/ZZ.h: No such file or directory
   33 | #include <NTL/ZZ.h>
      |          ^~~~~~~~~~
compilation terminated.

我使用以下方式安装 ntl 后

sudo apt-get install libntl-dev

但是在尝试再次编译后,我收到以下错误(这只是错误的最后一点,因为上面还有更多错误):

rank.cpp:(.text._ZNK6Givaro5ZRingINS_7IntegerEE4readERSiRS1_[_ZNK6Givaro5ZRingINS_7IntegerEE4readERSiRS1_]+0x27): undefined reference to `Givaro::operator>>(std::istream&, Givaro::Integer&)'
/usr/bin/ld: /tmp/cccUiBtG.o: in function `Givaro::ZRing<Givaro::Integer>::write(std::ostream&, Givaro::Integer const&) const':
rank.cpp:(.text._ZNK6Givaro5ZRingINS_7IntegerEE5writeERSoRKS1_[_ZNK6Givaro5ZRingINS_7IntegerEE5writeERSoRKS1_]+0x27): undefined reference to `Givaro::operator<<(std::ostream&, Givaro::Integer const&)'
/usr/bin/ld: /tmp/cccUiBtG.o: in function `Givaro::UnparametricOperations<Givaro::Integer>::assign(Givaro::Integer&, Givaro::Integer const&) const':
rank.cpp:(.text._ZNK6Givaro22UnparametricOperationsINS_7IntegerEE6assignERS1_RKS1_[_ZNK6Givaro22UnparametricOperationsINS_7IntegerEE6assignERS1_RKS1_]+0x27): undefined reference to `Givaro::Integer::operator=(Givaro::Integer const&)'
/usr/bin/ld: /tmp/cccUiBtG.o: in function `Givaro::UnparametricOperations<Givaro::Integer>::read(std::istream&, Givaro::Integer&) const':
rank.cpp:(.text._ZNK6Givaro22UnparametricOperationsINS_7IntegerEE4readERSiRS1_[_ZNK6Givaro22UnparametricOperationsINS_7IntegerEE4readERSiRS1_]+0x27): undefined reference to `Givaro::operator>>(std::istream&, Givaro::Integer&)'
/usr/bin/ld: /tmp/cccUiBtG.o: in function `Givaro::UnparametricOperations<Givaro::Integer>::write(std::ostream&, Givaro::Integer const&) const':
rank.cpp:(.text._ZNK6Givaro22UnparametricOperationsINS_7IntegerEE5writeERSoRKS1_[_ZNK6Givaro22UnparametricOperationsINS_7IntegerEE5writeERSoRKS1_]+0x27): undefined reference to `Givaro::operator<<(std::ostream&, Givaro::Integer const&)'
/usr/bin/ld: /tmp/cccUiBtG.o: in function `void std::_Construct<Givaro::Rational>(Givaro::Rational*)':
rank.cpp:(.text._ZSt10_ConstructIN6Givaro8RationalEJEEvPT_DpOT0_[_ZSt10_ConstructIN6Givaro8RationalEJEEvPT_DpOT0_]+0x26): undefined reference to `Givaro::Neutral::zero'
/usr/bin/ld: rank.cpp:(.text._ZSt10_ConstructIN6Givaro8RationalEJEEvPT_DpOT0_[_ZSt10_ConstructIN6Givaro8RationalEJEEvPT_DpOT0_]+0x4a): undefined reference to `Givaro::Rational::Rational(Givaro::Neutral)'
/usr/bin/ld: /tmp/cccUiBtG.o: in function `void std::_Construct<Givaro::Rational, Givaro::Rational const&>(Givaro::Rational*, Givaro::Rational const&)':
rank.cpp:(.text._ZSt10_ConstructIN6Givaro8RationalEJRKS1_EEvPT_DpOT0_[_ZSt10_ConstructIN6Givaro8RationalEJRKS1_EEvPT_DpOT0_]+0x43): undefined reference to `Givaro::Rational::Rational(Givaro::Rational const&)'
collect2: error: ld returned 1 exit status

安装此软件包及其所有必需依赖项的最简单方法是什么?抱歉,我不太擅长安装这些类型的软件包。

答案1

您的命令

g++ rank.cpp -o rank

不足以创建可执行程序——它无法链接任何所需的库(也无法设置适当的编译标志)。

获取这些的最简单方法是使用提供的pkg-config文件:

g++ -o rank rank.cpp $(pkg-config --cflags --libs linbox)

如果你对标志/库感兴趣,你可以直接执行命令:

$ pkg-config --cflags --libs linbox
-DDISABLE_COMMENTATOR -fopenmp -fabi-version=6 -llinbox-1.6.3 -lntl -lmpfr -liml -fopenmp -lblas -llapack -lgivaro -lgmp -lgmpxx

相关内容