Я пытаюсь создать большой проект Java/c++ с участием JNI и ANT в Eclipse под Linux. Один из исходных файлов c++ вызывает функцию log10()
для математических вычислений. Проект компилируется отлично, но не удается связать, где он жалуется, что он не может найти библиотеку libm.so
необходимую для связи log10()
.
Моя проблема в том, что я не могу правильно сообщить Eclipse, чтобы связать этот файл, даже после следующих шагов:
libm
в списке ссылок компоновщика,-lm
в полный список параметров компиляции,LD_LIBRARY_PATH
для указания местоположения библиотеки,Что я делаю неправильно/у кого-нибудь был такой опыт с правильной привязкой libs в Eclipse? Какие-либо предложения?
Это немного запутанно. Если вы не можете найти свою библиотеку во время выполнения внутри вашей java-среды:
Попробуйте загрузить вашу.so-библиотеку внутри среды java, прежде чем делать какие-либо вызовы log10.
System.LoadLibrary("m");
Обратите внимание, как я оставил "lib" и ".so".
Однако вы жалуетесь на проблему Linker из C++, вы не можете ссылаться на динамический файл. Вы можете ссылаться только на статическую библиотеку или на статическую библиотеку экспорта (так что вам нужен файл libm.a, на который нужно ссылаться во время компиляции, а затем вашей программе потребуется libm.so во время выполнения).
Не могли бы вы отправить точное сообщение, которое вы получаете, и когда вы его получили?
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
libm.so
и даже сообщает мне, где он находится (/lib64/
). Затем он продолжает говорить мне, что мне «просто» нужно связаться с этим местом, и все будет хорошо. И когда я это делаю, он просто выплевывает ту же ошибку.