2015-01-14 2 views
1

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

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

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

компилируется и работает.

Затем я пытаюсь использовать zkcm; Я стараюсь compliling линии

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

Вы пытались изменить порядок передачи имен библиотек компилятору? – Cameron

+0

Я попробовал это немного сейчас, без каких-либо результатов. Какой-то конкретный порядок? Я бы предпочел не попробовать все 120 :). Порядок в OP - это один из README zkcm. – jorgen

+1

Я видел, что вещи не связываются, если зависимые библиотеки одной библиотеки были помещены в неправильном порядке относительно самой библиотеки (так, всего два заказа для тестирования). Но на этот раз это не так. – Cameron

ответ

1

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

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

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

+0

Это работает, спасибо большое! По какой-то причине я думал, что логика порядка противоположна. – jorgen