2009-08-27 3 views
3

Я написал приложение C, которое использует библиотеку PCRE. Все работает на моем собственном компьютере. Однако, когда я копирую двоичный код на другой компьютер и запускаю его, он дает следующую ошибку:Развертывание приложения C, использующего библиотеку PCRE

/libexec/ld-elf.so.1: Общий объект "libpcre.so.0" не найден, требуется "myapp"

Я знаю, что я, вероятно, могу заставить его работать, установив PCRE lib на целевой компьютер. Тем не менее, мне интересно, есть ли более удобный способ сделать это? (просто копирование нескольких файлов lib?)

Я попытался скопировать файл libpcre.so.0, но это не сработало.

Любая помощь приветствуется! Спасибо,

ответ

2

Лучше либо установить его, либо связать его статически. Первый, конечно, легче ресурсов. Лучший способ обеспечить совместимость - это создать пакет для целевой системы, указав все зависимости (в зависимости от дистрибутива, coursE).

+0

Как связать pcre в статически? Я очень плохо разбираюсь в компиляции c/C++ – Dave

+0

Существует несколько способов. Вы можете связать все мысли статически, предоставив опцию '-static' для' gcc' или вы можете указать библиотеку libpcre.a вместо -lpcre (или что бы то ни было в вашей командной строке). Собственно, это зависит от вашего механизма сборки. –

0

Вы должны быть в состоянии скопировать его, а затем установить envvar LD_LIBRARY_PATH к папке, в которой она существует, или даже создать скрипт, который устанавливает этот envvar запускает программу следующим образом

LD_LIBRARY_PATH=. ./your_program 

Проверить Program Library How To

+0

Да, это один из возможных способов. Но компиляция его статически кажется более идеальной для моей ситуации – Dave

2

Как сказал @hacker, вы либо должны убедиться, что вы устанавливаете PCRE на целевую машину, либо вам нужно использовать статическую библиотеку (вместо libpcre.so) на машине разработки. Это также может означать, что вам нужно создать PCRE со статической библиотекой, и вам придется использовать правильные параметры времени компиляции, чтобы вытащить статическую библиотеку. Один относительно простой способ сделать это - указать /usr/lib/libpcre.a в командной строке компилятора. В идеале, вы также не должны включать -lpcre в командной строке - конечно, вам нужно, чтобы статическая библиотека отображалась перед общей библиотекой.

Возможно, ваша копия не удалась из-за проблем с символическими ссылками. Вы, как правило, ссылаются на файл, такие как:

/usr/lib/libpcre.so 

но это символическая ссылка на версированной библиотеки, такие как:

/usr/lib/libpcre.so.0 

Или это может работать наоборот. Если вы использовали tar для копирования, вы можете скопировать символическую ссылку.

В идеале вы устанавливаете PCRE в системный каталог, но для этого требуются привилегии root. Вы также должны быть осторожны, чтобы не перезаписывать более новую версию PCRE с более старой версией. Вы также не должны запрещать пользователям устанавливать переменную среды LD_LIBRARY_PATH (или ее эквиваленты) или принуждать их использовать конфигурационную программу (ld.so.conf?).

+0

Компиляция ее статически кажется лучшей для моей ситуации, так как у меня нет прав root на целевом компьютере.однако я не могу заставить работать компилируемые строки. Я включил -статический флаг и избавился от lpcre, но теперь он не найдет файл lib (дает мне кучу функций pcre как неопределенные ошибки). – Dave

+0

попробуйте заменить -lpcre на /usr/lib/libpcre.a (или там, где ваш libpcre.a есть) –

+0

Когда Джонатан говорит об избежании -lpcre, он, конечно же, не означает его удаление без надлежащей замены. –