zkcm-библиотека не нашла mpfr-библиотеку

Я только что установил библиотеку zkcm на мою машину kubuntu, и у меня возникли проблемы с компиляцией кода C++.

Я установил gmp а также mpfr библиотеки и проверили, что они работают; код

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'

Я пытался следовать инструкциям от zkcm; У меня есть строки

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

и я компилирую код (называется test.cpp) с помощью

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

Есть идеи?

1 ответ

Решение

Порядок библиотек неверен: согласно сообщению об ошибке, zkcm использует MPFR, так что -lzkcm следует поставить перед -lmpfr (который сам должен быть поставлен перед -lgmp потому что MPFR использует GMP).

В противном случае происходит следующее: если компоновщик находит символ MPFR, который не используется test.cpp (или некоторая зависимость), это отбросит это. И если zkcm использует такой символ, это приведет к ошибке, так как -lzkcm приходит позже в командной строке. Это также объясняет, почему вы можете получить ошибки для некоторых символов MPFR, а не для других (и ошибки могут появляться и исчезать, когда test.cpp код и изменение кода zkcm).

Этого должно быть достаточно для решения проблемы здесь. Но посмотрите на этот ответ "Порядок компоновщика - GCC" для более общих правил (этот ответ также касается циклических зависимостей).

Другие вопросы по тегам