0

因此,我想使用 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 块但没有运气:

extern "C" {
  static int ta_entry() {
     // C/C++ codes here ..
  }
} 

同样,当我通过 nm 检查共享库中的“fd_ext_init”定义时,它会像:

0000000000008140 T _Z11fd_ext_initiiPc
4

1 回答 1

0

好好调查!

fd_ext_initextern "C"街区也有吗?freeDiameter 希望在运行时按名称解析的所有 API 都需要在extern "C"块中,这样名称就不会被破坏。

请注意, fd_ext_init 是由EXTENSION_ENTRY宏定义的,因此您需要调用 in extern "C"

(我实际上并不期望 ta_entry 需要进入该extern "C"块 - 我认为这不需要在运行时通过名称来解决。)

我希望这会有所帮助!

于 2017-01-16T14:48:03.897 回答