Hi there PJProject devs.
When compiling Asterisk, I encountered an error similar to this:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=804460
The linker was told to include shared libraries that did not exist on the
system:
x86_64-linux-gnu-gcc -o pjsip/dialplan_functions.o -c
...
-lpjsua2 -lstdc++ -lpjsua -lpjsip-ua -lpjsip-simple
-lpjsip -lpjmedia-codec -lpjmedia -lpjmedia-videodev
-lpjmedia-audiodev -lpjmedia -lpjnath -lpjlib-util
-lsrtp -lpj -lm -lrt -lpthread -lSDL2 -lavformat-ffmpeg
-lavcodec-ffmpeg -lswscale-ffmpeg -lavutil-ffmpeg -lv4l2
-lopencore-amrnb -lopencore-amrwb
/usr/bin/ld: cannot find -lSDL2
/usr/bin/ld: cannot find -lavformat-ffmpeg
...
I believe that the problem is caused by pkg-config --libs telling us to
include more libs than it should.
For example, on this system, it says:
$ pkg-config --libs libpjproject
-L/usr/local/lib -lpjsua2 -lstdc++ -lpjsua -lpjsip-ua
-lpjsip-simple - lpjsip -lpjmedia-codec -lpjmedia-videodev
-lpjmedia-audiodev -lpjmedia -lpjnath -lpjlib-util -lsrtp
-lgsmcodec -lspeex -lilbccodec -lg7221codec -lpj -luuid -lm
-lrt -lpthread -lcrypto -lssl
The -luuid and -lm and -lrt and a few more should not be in that list.
They are used and linked by libpjsip.so (and others), so we don't need to
link to them another time:
$ ldd /usr/local/lib/libpjsip.so | grep uuid
libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007fdf0a8da000)
Are more complete writeup is here:
http://wjd.nu/notes/2016#missing-sofiles-linker-asterisk
Attached is my attempt at fixing it.
It adds a new make target: libpjproject.pc
That way I didn't have to make install
the entire time.
It replaces a few rmdir
with $(HOST_RMDIR)
(and friends) for
consistency.
For the libpjproject.pc target, it checks whether any *.so is built.
If so, it separates the dynamic libs from the privately used ones.
If no *.so is built, the libpjproject.pc is built as it was before
this change (with an additional empty "Libs.private" section).
This way we won't cause unintentional breakage for static builds.
Let me know if this works for you (and if this is the right channel to
submit a patch).
Cheers!
Walter Doekes
OSSO B.V.
====
$ diff libpjproject.pc.original libpjproject.pc.after
12a13
Libs.private:
$ cat libpjproject.pc.enable_shared | tail -n3
Libs: -L${libdir} -lsrtp -lresample -lgsmcodec -lspeex -lilbccodec
-lg7221codec -lportaudio -lpjsua2 -lpjsua -lpjsip-ua -lpjsip-simple
-lpjsip -lpjmedia-codec -lpjmedia-videodev -lpjmedia -lpjmedia-audiodev
-lpjnath -lpjlib-util -lpj
Libs.private: -lstdc++ -lssl -lcrypto -luuid -lm -lrt -lpthread -lavcodec
-lavutil -lv4l2
Cflags: -I${includedir} -I/usr/local/include -DPJ_AUTOCONF=1 -O2
-DPJ_IS_BIG_ENDIAN=0 -DPJ_IS_LITTLE_ENDIAN=1 -fPIC
Hi Walter,
Thanks for the patch and the detail info. And yes, this is the right
channel to submit a patch :)
We'll review this internally first and get back to you as soon as possible.
BR,
nanang
On Wed, Feb 24, 2016 at 4:35 PM, Walter Doekes walter+pjsip@wjd.nu wrote:
Hi there PJProject devs.
When compiling Asterisk, I encountered an error similar to this:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=804460
The linker was told to include shared libraries that did not exist on the
system:
x86_64-linux-gnu-gcc -o pjsip/dialplan_functions.o -c
...
-lpjsua2 -lstdc++ -lpjsua -lpjsip-ua -lpjsip-simple
-lpjsip -lpjmedia-codec -lpjmedia -lpjmedia-videodev
-lpjmedia-audiodev -lpjmedia -lpjnath -lpjlib-util
-lsrtp -lpj -lm -lrt -lpthread -lSDL2 -lavformat-ffmpeg
-lavcodec-ffmpeg -lswscale-ffmpeg -lavutil-ffmpeg -lv4l2
-lopencore-amrnb -lopencore-amrwb
/usr/bin/ld: cannot find -lSDL2
/usr/bin/ld: cannot find -lavformat-ffmpeg
...
I believe that the problem is caused by pkg-config --libs telling us to
include more libs than it should.
For example, on this system, it says:
$ pkg-config --libs libpjproject
-L/usr/local/lib -lpjsua2 -lstdc++ -lpjsua -lpjsip-ua
-lpjsip-simple - lpjsip -lpjmedia-codec -lpjmedia-videodev
-lpjmedia-audiodev -lpjmedia -lpjnath -lpjlib-util -lsrtp
-lgsmcodec -lspeex -lilbccodec -lg7221codec -lpj -luuid -lm
-lrt -lpthread -lcrypto -lssl
The -luuid and -lm and -lrt and a few more should not be in that list.
They are used and linked by libpjsip.so (and others), so we don't need to
link to them another time:
$ ldd /usr/local/lib/libpjsip.so | grep uuid
libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007fdf0a8da000)
Are more complete writeup is here:
http://wjd.nu/notes/2016#missing-sofiles-linker-asterisk
Attached is my attempt at fixing it.
It adds a new make target: libpjproject.pc
That way I didn't have to make install
the entire time.
It replaces a few rmdir
with $(HOST_RMDIR)
(and friends) for
consistency.
For the libpjproject.pc target, it checks whether any *.so is built.
If so, it separates the dynamic libs from the privately used ones.
If no *.so is built, the libpjproject.pc is built as it was before
this change (with an additional empty "Libs.private" section).
This way we won't cause unintentional breakage for static builds.
Let me know if this works for you (and if this is the right channel to
submit a patch).
Cheers!
Walter Doekes
OSSO B.V.
====
$ diff libpjproject.pc.original libpjproject.pc.after
12a13
Libs.private:
$ cat libpjproject.pc.enable_shared | tail -n3
Libs: -L${libdir} -lsrtp -lresample -lgsmcodec -lspeex -lilbccodec
-lg7221codec -lportaudio -lpjsua2 -lpjsua -lpjsip-ua -lpjsip-simple
-lpjsip -lpjmedia-codec -lpjmedia-videodev -lpjmedia -lpjmedia-audiodev
-lpjnath -lpjlib-util -lpj
Libs.private: -lstdc++ -lssl -lcrypto -luuid -lm -lrt -lpthread -lavcodec
-lavutil -lv4l2
Cflags: -I${includedir} -I/usr/local/include -DPJ_AUTOCONF=1 -O2
-DPJ_IS_BIG_ENDIAN=0 -DPJ_IS_LITTLE_ENDIAN=1 -fPIC
Visit our blog: http://blog.pjsip.org
pjsip mailing list
pjsip@lists.pjsip.org
http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org