I am making one dynamic library by using some function of libmxml.a library but I get this warning:
*Warning: Linking the shared library libgstmatroskademux.la against the _
*static library /home/Mr32/gst-template4_final/gst-plugin/src/libmxml.a _
is not portable!
I also get this warning:
gcc: /home/Mr32/gst-template4_final/gst-plugin/src/libmxml.a: linker _
input file unused because linking not done
So what's the meaning of this warning and how could I solve it?
Edit :
There is one already autogenerated make file for compiling the gstreamer plugin. Now to use some function of libmxml.a in that plugin I have added $(PATH)/libmxml.a
in the GST_CFLAGS
variable in the make file. Now, when I do make
and make install
, the plugin works fine, but I still get this warning.
Ensure that object files in libmxml.a
were built with -fPIC
. It's necessary to build a shared library. See also http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Here's a quick example
$ cat stat.c
int five() { return 5; }
$ gcc -c stat.c -fPIC
$ ar crus libstat.a stat.o
$ cat dynamic.c
int ten() { return five() + five(); }
$ gcc -c dynamic.c -fPIC
$ gcc -shared -o libdyn.so dynamic.o -L. -lstat
$ ldd libdyn.so # Just to show static linkage to libstat.a
linux-vdso.so.1 => (0x00007fffca1b8000)
libc.so.6 => /lib/libc.so.6 (0x00007fc004649000)
/lib/ld-linux-x86-64.so.2 (0x00007fc004bf7000)
$ cat main.c
int main() { return ten(); }
$ gcc main.c -L. -ldyn
$ LD_LIBRARY_PATH=. ./a.out
$ echo $?
10
Linking shared libraries to static libraries is not possible (unless you really know very well what you are doing). Don't do it.
The first warning is from libtool. It tells you, that the operation you asked for will do different things on different systems and some of those things are probably not what you want. Often it's just going to fail in various spectacular ways, because code that goes in shared and static libraries needs to be compiled with different compiler flags.
The second warning is from gcc. It is telling you that providing static library when compiling is pointless. That's because you have $(PATH)/libmxml.a
in CFLAGS
, where it has no business of being. In fact, most of the time you should not have $(PATH)/libmxml.a
, but -L$(PATH) -lmxml
instead. That should still go in LDFLAGS
, but gcc won't complain if this makes it to the compiler command-line too.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With