Spis treści
1) Objawy problemu
Po tym, jak w make menuselect
wybierzemy niezbędne moduły (w tym sterownik chan_iax2
– który jest domyślnie zaznaczony do instalacji) i wykonamy polecenie make
, pojawi się błąd związany z działaniem kompilatora gcc.
[CC] chan_iax2.c → chan_iax2.o
chan_iax2.c:418:64: error: expected ‘;’, ‘,’ or ‘)’ before ‘buf’
static char *auth_method_names(int authmethods, char *restrict buf)
static char *auth_method_names(int authmethods, char *restrict buf)
^
chan_iax2.c: In function ‘socket_process_helper’:
chan_iax2.c:11533:8: warning: implicit declaration of function ‘auth_method_names’ [-Wimplicit-function-declaration]
ast_verb(3, “Accepting AUTHENTICATED call from %s:\n”
^
chan_iax2.c:11533:8: warning: format ‘%s’ expects argument of type ‘char *’, but argument 8 has type ‘int’ [-Wformat=]
make[1]: *** [chan_iax2.o] Error 1
make: *** [channels] Error 2
2) Przyczyna problemu
W poprawce 59bc6ce, która rozwiązywała problemy z debuggowaniem uwierzytelniania dla chan_iax2
, użyto słowa kluczowego restrict
w definicji nowej funkcji auth_method_names
, ale to słowo kluczowe nie jest obsługiwane w wersjach gcc <= 4.9
. Powoduje to niepowodzenie kompilacji w starszych dystrybucjach takich jak CentOS 7, w których dostępny jest tylko gcc w wersji 4.8.
Na przykład w najnowszej wersji CentOS 7 wygląda to następująco:
# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
Jak widać, korzystamy z gcc w wersji 4.8.5.
Poprawka została wydana w marcu 2024, co zaznaczono na oficjalnych stronach np: ChangeLog. Wspomniano tam o poprawce:
- #586: [bug]: The „restrict” keyword used in chan_iax2.c isn’t supported in older gcc versions.
3) Rozwiązanie problemu
Najlepszym rozwiązaniem będzie po prostu zainstalowanie nowszej wersji Asteriska (wydanej po marcu 2024) lub instalację na nowszym, a co za tym idzie bezpieczniejszym systemie operacyjnym. Jeśli z jakiegoś powodu nie jest to możliwe, poniżej znajdziesz rozwiązanie.
Bardzo często okazuje się, że parametry domyślnej kompilacji i instalacji Asteriska zawierają mnóstwo komponentów, sterowników i plików audio których nie potrzebujemy. Warto ręcznie przejrzeć opcje kompilatora i usunąć te składniki, których nie będziemy wykorzystywać. Jeżeli w tym przypadku sterownik chan_iax2
nie będzie nam do niczego potrzebny, po prostu go odznaczmy przed wykonaniem polecenia make
.
make menuselect
Jeżeli jednak chan_iax2
jest nam niezbędny, trzeba jeszcze raz wykonać polecenie configure
tym razem z flagą -std=gnu99
. Kompilator gcc dla CentOS 7 domyślnie używa flagi –std=gnu90
.
./configure --with-jansson-bundled CFLAGS=-std=gnu99
Następnie jeszcze raz wykonujemy polecenie make
, które tym razem kończy się bez błędów.
make
Możemy więc dalej kontynuować konfigurację naszego systemu.
Ale powiedzmy sobie szczerze … może jedak warto pomyśleć o aktualizacji oprogramowania?
Jeżeli chciałbyś monitorować wszystko, co dzieje się na Twojej centrali, wypróbuj nasze autorskie oprogramowanie VoiperoManager.
Instalacja i konfiguracja zajmuje kilka minut, a system możesz mieć całkowicie za darmo.
Przeczytaj, co potrafi nasz system VoiperoManager w zakresie monitorowania na żywo i raportowania systemów VoIP opartych na Asterisku.