nuclear_kote
@nuclear_kote

Почему в либе собранной g++ jna не находит функцию?

Вообщем есть такая статья :
https://habr.com/post/113436/

когда делаю все по инструкции все работает, но если меняю gcc на g++ то получаю что то такое :
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'registerCallback': /root/tmp/libmy.so: undefined symbol: registerCallback
	at com.sun.jna.Function.<init>(Function.java:245)
	at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:566)
	at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:542)
	at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:528)
	at com.sun.jna.Library$Handler.invoke(Library.java:228)
	at com.sun.proxy.$Proxy0.registerCallback(Unknown Source)
	at com.test.Test.main(Test.java:14)


как собирать под g++?

UPD:
objdump -x показывает что после сборки g++ метод называется _Z16registerCallbackPFvPcS_E
а в gcc просто registerCallback
  • Вопрос задан
  • 131 просмотр
Решения вопроса 2
Nipheris
@Nipheris Куратор тега C++
Это потому что когда вы вызываете g++ используются другие дефолтовые настройки, по умолчанию ваш код считается кодом на C++ (даже файлы с расширением.c, см. https://stackoverflow.com/questions/172587/what-is... ) и, соответственно, начинает работать name mangling. Варианты действий:
- использовать extern "C" для registerCallback;
- компилировать код как сишный код.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Объявляйте функции с extern "C".
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽