Вчера я загрузил значок и установил его, используя:
$ ./configure --prefix=/usr/local
$ make
$ make install
Когда я попытался запустить iconv
из оболочки, я получил жалобу, что файл общих объектов не найден, поэтому я выполнил export LD_LIBRARY_PATH=/usr/local/lib
. Затем работал значок.
Это вызвало ошибку в моем приложении. Я не знал, что в один из исходных файлов уже включен iconv.h
. Сегодня я успешно построил отладочную версию несколько раз в eclipse, но когда дело доходит до сборки релиза, я получаю следующие ошибки:
undefined reference to 'libiconv_close'
undefined reference to 'libiconv_open'
undefined reference to 'libiconv'
Затем я впал в панику и начал make uninstall
, перезагрузился, но проблема остается. Как я могу снова запустить свою программу?
ldconfig -v | grep "iconv" shows:
libiconv.so.2 -> libiconv.so.2.5.1
Я на Ubuntu 12.04 LTS
LD_LIBRARY_PATH
является переопределением, которое должно использоваться только для целей отладки или для работы с ошибками, которые было бы слишком сложно исправить в противном случае.
Ни в коем случае не следует устанавливать его глобально в своей среде, потому что именно то, что вы описали здесь, должно произойти рано или поздно, особенно когда вы устанавливаете вручную скомпилированное программное обеспечение в системные каталоги... (Вопрос: Почему вы не установили iconv
через ваш менеджер пакетов? Это всегда должно быть вашим первым выбором.)
Если для установки iconv
требуется путь к библиотеке, создайте псевдоним с локальным переопределением:
alias iconv="LD_LIBRARY_PATH=/usr/local/lib iconv"
Это заставляет iconv
работать корректно, но не влияет на другие пакеты или создает процессы.
В нижней строке найдите export LD_LIBRARY_PATH=...
(где бы вы его ни разместили) и избавляйтесь от него. Это должно заставить ваше приложение правильно скомпилировать (если, конечно, вы не скомпилировали свою систему вручную, установив/удалили в /usr
...)
-liconv
и скопирую общий объектный файл в/usr/lib
. Как получилось, что раньше это обходилось без этого?iconv.h
не копируется в проект.--prefix
программного обеспечения куда-то в $ {HOME}, если это необходимо, но/usr
должен быть единственным доменом вашего менеджера пакетов. Вы обязательно столкнетесь с проблемами позже (например, когда менеджер пакетов удалит или перезапишет файлы, которые вы поместили в/usr
вручную).