Линкер не может найти lib в Eclipse / JNI / ANT

0

Я пытаюсь создать большой проект Java/c++ с участием JNI и ANT в Eclipse под Linux. Один из исходных файлов c++ вызывает функцию log10() для математических вычислений. Проект компилируется отлично, но не удается связать, где он жалуется, что он не может найти библиотеку libm.so необходимую для связи log10().

Моя проблема в том, что я не могу правильно сообщить Eclipse, чтобы связать этот файл, даже после следующих шагов:

  1. Добавлен правильный путь библиотеки в параметрах компоновщика,
  2. Добавлена ссылка на libm в списке ссылок компоновщика,
  3. Добавлено -lm в полный список параметров компиляции,
  4. Установите LD_LIBRARY_PATH для указания местоположения библиотеки,
  5. Скопировал библиотеку в текущий каталог.

Что я делаю неправильно/у кого-нибудь был такой опыт с правильной привязкой libs в Eclipse? Какие-либо предложения?

  • 0
    Не уверен, но вы на x86_64 машине компилируете для 32 бита?
  • 0
    64 бит, компиляция для 64 бит. Компоновщик явно хочет получить 64-битную версию libm.so и даже сообщает мне, где он находится ( /lib64/ ). Затем он продолжает говорить мне, что мне «просто» нужно связаться с этим местом, и все будет хорошо. И когда я это делаю, он просто выплевывает ту же ошибку.
Показать ещё 5 комментариев
Теги:
linker
ant
jni

1 ответ

1

Это немного запутанно. Если вы не можете найти свою библиотеку во время выполнения внутри вашей java-среды:

Попробуйте загрузить вашу.so-библиотеку внутри среды java, прежде чем делать какие-либо вызовы log10.

System.LoadLibrary("m");

Обратите внимание, как я оставил "lib" и ".so".

Однако вы жалуетесь на проблему Linker из C++, вы не можете ссылаться на динамический файл. Вы можете ссылаться только на статическую библиотеку или на статическую библиотеку экспорта (так что вам нужен файл libm.a, на который нужно ссылаться во время компиляции, а затем вашей программе потребуется libm.so во время выполнения).

Не могли бы вы отправить точное сообщение, которое вы получаете, и когда вы его получили?

  • 0
    Вызов log10() выполняется в файле c ++. JNI нужны скомпилированные исходные файлы c ++, прежде чем он сможет запустить код Java, поэтому он все еще находится на стадии компиляции c ++. Полное сообщение об ошибке выглядит следующим образом: source.o: undefined reference to symbol 'log10@@GLIBC_2.2.5. ld: note: 'log10@@GLIBC_2.2.5' is defined in DSO /lib64/libm.so.6 so try adding it to the linker command line
  • 0
    Тогда действительно, что Крисб предложил в своих комментариях, это правильный подход. Вам нужно связать libm статически (добавьте -lm к вашим флагам complier, желательно в конце оператора include library) ... Странно, что этот подход не решил вашу проблему. Не могли бы вы опубликовать команду компиляции, которую вы используете? Можете ли вы скомпилировать Hello World, используя math.h и -lm?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню