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 就会通过。