Итак, я хотел бы использовать C ++ для разработки расширения Freediameter,
Общая библиотека скомпилирована и связана успешно, однако, когда она будет использоваться демоном freediameter, я получаю эту ошибку:
01/16/17,00:04:59.215241 ERROR Unable to resolve symbol 'fd_ext_init' for extension /home/usr/Downloads/freeDiameter-master/extensions/ocs_app/ocs_app.fdx: Undefined symbol "fd_ext_init"01/16/17,00:04:59.215361 ERROR ERROR: in '((fd_ext_load()))' : Invalid argument
01/16/17,00:04:59.215377 ERROR ERROR: in '(fd_core_parseconf(conffile))' : Invalid argument
01/16/17,00:04:59.215387 FATAL! Initiating freeDiameter shutdown sequence (1)
Я предполагаю, что у этого есть кое-что с искажением имени, но я не могу найти решение. уже пытался поставить точку входа во внешний блок но не повезло
extern "C" {
static int ta_entry() {
// C/C++ codes here ..
}
}
также, когда я проверяю определение «fd_ext_init» в совместно используемой библиотеке через nm, это будет выглядеть так:
0000000000008140 T _Z11fd_ext_initiiPc
Хорошее расследование!
У вас был fd_ext_init
в вашем extern "C"
блокировать тоже? Все API, которые freeDiameter хочет разрешить по имени во время выполнения, должны находиться в extern "C"
блок, чтобы там имена не искалечены.
Обратите внимание, что fd_ext_init определяется EXTENSION_ENTRY
макрос, так что это ваш вызов того, что нужно идти в extern "C"
,
(Я бы не ожидал, что ta_entry нужно будет идти в extern "C"
блок — я думаю, что это не нужно будет решать по имени во время выполнения.)
Надеюсь, это поможет!
Других решений пока нет …