1

我刚刚在我的 kubuntu 机器上安装了zkcm 库,但在编译 c++ 代码时遇到了问题。

我已经安装了gmpandmpfr库并检查了它们是否工作;编码

mpfr_t m1, m2, m3; 
mpfr_init(m1); mpfr_init(m2); mpfr_init(m3); 
mpfr_mul(m1, m2, m3, MPFR_RNDN);

编译并运行。

然后我尝试使用zkcm;我尝试编译该行

zkcm_matrix m;

并得到一堆似乎关于zkcm找不到的错误mpfr;这是输出的开头:

/usr/local/lib/libzkcm.a(zkcm_c.o): In function `zkcm_init_ri(zkcm*, double, double)':
/home/jorgen/Downloads/zkcm_lib-0.4.0/srcs/zkcm_c.c:126: undefined reference to `mpfr_inits'
/home/jorgen/Downloads/zkcm_lib-0.4.0/srcs/zkcm_c.c:127: undefined reference to `mpfr_set_d'
/usr/local/lib/libzkcm.a(zkcm_c.o): In function `zkcm_init_ri_str(zkcm*, char const*, char const*)':
/home/jorgen/Downloads/zkcm_lib-0.4.0/srcs/zkcm_c.c:132: undefined reference to `mpfr_inits'
/home/jorgen/Downloads/zkcm_lib-0.4.0/srcs/zkcm_c.c:136: undefined reference to `mpfr_set_str'
/home/jorgen/Downloads/zkcm_lib-0.4.0/srcs/zkcm_c.c:134: undefined reference to `mpfr_set_ui'

我已尝试按照 infrom 中的说明进行操作zkcm;我有线条

#include "mpfr.h"
#include "zkcm.hpp"

我编译代码(称为test.cpp)使用

g++ test.cpp -msse2 -std=c++11 -O2 -lm -lmpfr -lgmp -lgmpxx -lzkcm -o test

有任何想法吗?

4

1 回答 1

1

库顺序不正确:根据错误信息,zkcm 使用 MPFR,所以-lzkcm应该放在前面(因为 MPFR 使用 GMP -lmpfr,它本身应该放在前面)。-lgmp

否则会发生以下情况:如果链接器发现了一个未被test.cpp(或某些依赖项)使用的 MPFR 符号,它将丢弃它。如果 zkcm 使用这样的符号,这将产生错误,因为-lzkcm稍后会在命令行中出现。test.cpp这也解释了为什么您可能会收到一些 MPFR 符号而不是其他符号的错误(当代码和 zkcm 代码更改时,错误可能会出现和消失)。

这应该足以解决这里的问题。但是请查看“链接器顺序 - GCC”的这个答案以了解更一般的规则(这个答案也涉及循环依赖)。

于 2015-01-15T09:23:44.990 回答