定义 AST_INLINE_API(hdr,body) hdr;外部内联 hdr 主体

定义 AST_INLINE_API(hdr,body) hdr;外部内联 hdr 主体

Asterisk 13.1.0 在 Xenial 的 repos 中可用。

但我支持需要 Asterisk 1.8 LTS 的应用程序,因为我们使用自定义插件。我们需要继续使用 Asterisk 1.8 并从源代码构建它,直到我们可以将插件移植到较新版本的 Asterisk。

但是,似乎 Asterisk 1.8 无法使用 Xenial 上可用的 g++ 版本(即 5.3.1)进行构建。我收到大量警告,这些警告可以忽略,但也收到大量有关重复定义符号的致命错误,即使我可以解决这些错误,也可能出现其他致命错误。

例子:

iax2-parser.o: In function `ast_atomic_fetchadd_int':
asterisk-1.8/include/asterisk/lock.h:600: multiple definition of `ast_atomic_fetchadd_int'
chan_iax2.o:asterisk-1.8/include/asterisk/lock.h:600: first defined here
iax2-parser.o: In function `ast_atomic_dec_and_test':
asterisk-1.8/include/asterisk/lock.h:646: multiple definition of `ast_atomic_dec_and_test'
chan_iax2.o:asterisk-1.8/include/asterisk/lock.h:646: first defined here
...etc...

我一直在阅读其他遇到此问题的人的帖子,并且一直尝试使用编译器选项来解决这个问题,但没有成功。

我的问题是是否有任何解决方案可以执行以下操作之一:

  • 使用 g++ 5.3.1 构建 Asterisk 1.8 并解决编译错误。
  • 在 Xenial 上安装旧版本的 g++(例如,我知道 g++ 4.4.7 可以在我们的旧操作系统上编译 Asterisk 1.8)。
  • 构建可在 Xenial 上运行的 Asterisk 版本的其他解决方案。也许在 Ubuntu 14.04 上构建并打包二进制文件?我预计会出现库版本冲突。

有些人会轻率地说:“你真的应该升级到 Asterisk 13.1.0。”是的,我当然知道那会是一个更好的计划。我知道 Asterisk 1.8 有已达到 EOL 水平。获取资源以将我们的插件移植到 Asterisk 13.1.0 是阻碍我们前进的因素。

答案1

根据@steeldriver的提示,我了解到Ubuntu 16.04在其标准存储库中有一个用于gcc-4.8和的软件包g++-4.8。我安装了g ++和构建Asterisk 1.8所需的其他一些软件包:

apt-get install g++-4.8 libcurl4-openssl-dev libncurses5-dev libxml2-dev

这将g++4.8作为与版本 5.3.1 不同的二进制文件进行安装g++,后者也已安装。我只需配置 Asterisk 构建以使用g++4.8,然后构建:

./configure CXX=g++4.8
make -j4
make install

终于!成功了!我在 Ubuntu 16.04 上构建了这个 Asterisk 1.8 的旧版本。

答案2

正如 Bill Karwin 所回答的,这是一个 gcc 问题。但我在为 configure 添加一个额外标志后才成功构建了 Asterisk 1.8:

./configure CXX=g++-4.8 CC=gcc-4.8

还请注意值中的连字符。

答案3

在 Ubuntu 18.04 上:

sudo apt install g++-4.8

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 1`  
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 1`  

对于 tcptls:

sudo apt install libssl1.0-dev`

./configure 
make menuselect
make

答案4

我发现这是由内联问题引起的。

在include/asterisk/inline_api.h第49行中:

定义 AST_INLINE_API(hdr,body) hdr;外部内联 hdr 主体

将其更改为:

定义 AST_INLINE_API(hdr,body) hdr;

然后 make 就会通过。

相关内容