Asterisk 12 and later versions contain two SIP stacks: one, the original chan_sip SIP channel driver that has been present in all previous releases of Asterisk, and a new SIP stack that is based on pjproject. For more information on configuring the new SIP stack, see Configuring res_pjsip.
Because earlier releases of pjproject cannot build shared object libraries, some changes were required in order to use it with Asterisk 12. As such, Asterisk requires pjproject version 2.2 or later. Alternatively, an Asterisk compatible version of pjproject is available on github , or - depending on your Linux distribution - available as a package.
Earlier versions of pjproject downloaded from www.pjsip.org will not work with Asterisk 12.
Building and Installing pjproject from Source
Obtaining pjproject from Teluu:
wgetto pull the latest version from
www.pjsip.org. Note that the instructions assume that this is 2.2.1; for the latest version, refer to
Obtaining the latest pjproject from the svn repo:
svnto install the latest version from www.pjsip.org.
Obtaining (old asterisk) pjproject from the github repo:
If you do not have git, install git on your local machine.
Checkout the Asterisk 12-compatible pjproject from the Asterisk github repo:
And that's it!
Building and Installing pjproject
The first step in building and installing pjproject is configuring it using configure. For Asterisk, this is arguably the most important step in this process. pjproject embeds a number of third party libraries which can conflict with versions of those libraries that may already be installed on your system. Asterisk will not use the embedded third party libraries within pjproject. As an example, if you are going to build the res_srtp module in Asterisk, then you must specify "--with-external-srtp" when configuring pjproject to point to an external srtp library.
Additionally, Asterisk REQUIRES two options to be passed to configure:
--enable-shared- instruct pjproject to build shared object libraries. Asterisk will only use shared objects from pjproject.
--prefix- specify Asterisk's preferred location for shared object libraries. This will be dependent on your distribution of Linux; typically this is either
/usr/libfor most systems or
/usr/lib64for 64-bit versions of Red-Hat based distributions.
Other common configure options needed for pjproject are listed below:
|libspeex shared objects||Make sure that the library development headers are accessible from pjproject. The CFLAGS and LDFLAGS environment variables may be used to set the include/lib paths.|
|libsrtp shared objects||Make sure that the library development headers are accessible from pjproject. The CFLAGS and LDFLAGS environment variables may be used to set the include/lib paths.|
|GSM codec||Make sure that the library development headers are accessible from pjproject. The CFLAGS and LDFLAGS environment variables may be used to set the include/lib paths.|
|Disable sound||Let Asterisk perform sound manipulations.|
Let Asterisk perform resample operations.
|Disable video||Disable video support in pjproject's media libraries. This is not used by Asterisk.|
|Disable AMR||--disable-opencore-amr||Disable AMR codec support. This is not used by Asterisk|
These are some of the more common options used to disable third party libraries in pjproject. However, other options may be needed depending on your system - see
Now that you understand the pjproject configure options available, change directories to the pjproject source directory:
In the pjproject source directory, run the configure script with the options needed for your system:
A few recommended options are shown. That includes setting a couple important CFLAGS, -O2 for common optimizations and -DNDEBUG to disable debugging code and assertions.
Update shared library links.
Verify that pjproject has been installed in the target location by looking for, and finding the various pjproject modules:
Finally, verify that Asterisk detects the pjproject libraries. In your Asterisk source directory:
- Browse to the Resource Modules category and verify that the
res_pjsipmodules are enabled:
- You're all done! Now, build and install Asterisk as your normally would.
Asterisk fails to detect pjproject libraries
After building and installing pjproject, Asterisk fails to detect any of the libraries - the various res_pjsip components cannot be selected in Asterisk's menuselect
Verify that Asterisk's config.log shows the following:
- Make sure you have
pkg-configinstalled on your system.
- pjproject will install the package config file in
/usr/lib/pkgconfig. Some distributions, notably Fedora, will instead look for the library in
/usr/lib64. Update your
PKG_CONFIG_PATHenvironment variable with
/usr/lib/pkgconfigand re-run Asterisk's
pjproject fails to build: errors related to opencore_amr
When building pjproject, errors about opencore_amr are displayed, e.g.:
You already have the AMR codec installed. Run
configure with the
--disable-opencore-amr option specified.
pjproject fails to build: video linker errors
When building pjproject, linker errors referring to various video methods are displayed, e.g.:
configure with either or both
ldconfig fails to display pjproject libraries
After building pjproject, the dump provided by
ldconfig -p doesn't display any libraries.
ldconfig to re-configure dynamic linker run-time bindings. This will need to be run with super user permissions.
pjproject fails to build on Raspberry Pi
pjproject/Asterisk fails to compile on your Raspberry Pi (raspbian) due to pjproject configure scripts not detecting endianness:
/usr/include/pj/config.h(using the editor of your choice)
- Replace this code:
Then recompile. This workaround was taken from issue ASTERISK-23315.
Uninstalling a Previous Version of pjproject
Typically, other versions of pjproject will be installed as static libraries. These libraries are not compatible with Asterisk and can confuse the build process for Asterisk 12. As such, any static libraries must be removed prior to installing the compatible version of pjproject.
pjproject provides an
uninstall make target that will remove previous installations. It can be called from the pjproject source directory like:
If you don't have an "uninstall" make target, you may need to fetch and merge the latest pjproject from https://github.com/asterisk/pjproject
Alternatively, the following should also remove all previously installed static libraries:
Finally, you will need to update shared library links:
If you want to run a sanity check, you can verify that pjproject has been uninstalled by ensuring no pjproject modules remain on the system:
If running the above command yields no results, that's it! You have successfully uninstalled pjproject from your system.