User forums > General (but related to Code::Blocks)

Why are these codec libraries still lingering?

(1/2) > >>

resander:
I have an application that uses ODBC to access databases. At one stage I wanted to test some video codec software (don't remember the details now), so I simply inserted code to test it right at the beginning of my ODBC database access code. I had to link to the codec's libavformat.so, which I defined via Project->Build Options->LinkerSettings. I removed  the codec testcode from source and the linker library settings after testing.

I then continued working on the ODBC access code, but everytime I linked I got the warning: /usr/bin/ld: warning libavcode.so.52 needed by /usr/lib/libavformat.so.52 may conflict with libavcodec.so.51. I thought it a bit strange, but ignored it because it seemed quite harmless.

Recently I have been having problems in connecting to Oracle Express via ODBC. The Oracle driver just stops in the middle of the connect call without issuing an error message. I am using Linux strace to try to find out where things might be going wrong. I have discovered lots of attempts to find codec libraries in the trace, but I can see no reason why an Oracle ODBC driver (= a software layer between an application program and the native Oracle code that implements the SQL database) would need video, audio codecs and speech compressors.   

Here are some open calls in the strace log:

open("/lib/tls/i686/cmov/libavcodec.so.51", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/libavcodec.so.51", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/tls/libavcodec.so.51", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/lib/libavcodec.so.51", O_RDONLY) = -1 ENOENT (No such file or directory)
   
open("/lib/tls/i686/cmov/libasound.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/libasound.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)

open("/lib/tls/i686/cmov/libavutil.so.49", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/libavutil.so.49", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/i686/cmov/libavutil.so.49", O_RDONLY) = 3

and similar open calls to load libgsm speech compressor, libvorbis audio codecs, libtheora video compression codecs and a few more.

Why are the codec libraries being loaded? Is it because I briefly hijacked the project to checkout the  avformat video codec?

I don't think this should be happening, but I don't know enough to figure out what to do next.

Hints would be most welcome.

MortenMacFly:

--- Quote from: resander on May 17, 2009, 06:40:21 pm ---I don't think this should be happening, but I don't know enough to figure out what to do next.

--- End quote ---
It can happen. For example: You exchanged the modified version with the old one which has an old time stamp. Thus you make C::B "believe" the compiled object file is still up-to-date so it get's linked in with the code you don't want. If you did such, a full re-build is strongly recommend. If you did experiments like described and cleaned up your project file a full re-build is recommended anyways.

resander:
I am using Rebuild on the Build menu most of the time, so the project is using the latest files. 

I requested a linkmap (via -Map=mapfilename) to check if there are any references to libavcodec/libavformat functions left by myself by mistake. I could not see any, but the map contains the following:

....
LOAD obj/Debug/util.o
LOAD /usr/lib/libodbc.so.1
LOAD /usr/lib/libSDL.so
LOAD /usr/lib/libSDL_image.so
LOAD /usr/lib/libavcodec.so.51
LOAD /usr/lib/libavformat.so.52

The first util.o is my own and libodbc.so.1 is the unixODBC driver manager. I expect these, but the last four are intruders.


I have done Find in Files on the Search menu looking for avformat and avcodec and have also looked at each individual source file, but could not find anything.

The Link Settings section contains /usr/lib/libodbc.so.1 and the Other Link settings contains -Map=mapfilename.

There is a Libraries tab in Properties on the Project menu. It contains nothing in the 'Libraries used in Project' column and a list of libraries in 'Known libraries' column. The latter contains libavcodec, libavformat, theora and many other codecs, but libodbc and libSDL are not there.

Here is the output by ldd on my executable program file:

ken@ken-desktop:~$ ldd /home/ken/projects/lsken/bin/Debug/lsken
   linux-gate.so.1 =>  (0xb7f9f000)
   libodbc.so.1 => /usr/lib/libodbc.so.1 (0xb7f05000)
   libSDL-1.2.so.0 => /usr/lib/libSDL-1.2.so.0 (0xb7e73000)
   libSDL_image-1.2.so.0 => /usr/lib/libSDL_image-1.2.so.0 (0xb7e57000)
   libavcodec.so.51 => /usr/lib/i686/cmov/libavcodec.so.51 (0xb790a000)
   libavformat.so.52 => /usr/lib/i686/cmov/libavformat.so.52 (0xb7824000)
   libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7736000)
   libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7710000)
   libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7700000)
   libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb75a2000)
   libltdl.so.7 => /usr/lib/libltdl.so.7 (0xb7599000)
   libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7580000)
   libasound.so.2 => /usr/lib/libasound.so.2 (0xb74b8000)
   libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb74b4000)
   libdirectfb-1.0.so.0 => /usr/lib/libdirectfb-1.0.so.0 (0xb744d000)
   libfusion-1.0.so.0 => /usr/lib/libfusion-1.0.so.0 (0xb7444000)
   libdirect-1.0.so.0 => /usr/lib/libdirect-1.0.so.0 (0xb742f000)
   libpng12.so.0 => /usr/lib/libpng12.so.0 (0xb7409000)
   libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0xb73e9000)
   libtiff.so.4 => /usr/lib/libtiff.so.4 (0xb7393000)
   libz.so.1 => /usr/lib/libz.so.1 (0xb737d000)
   libavutil.so.49 => /usr/lib/i686/cmov/libavutil.so.49 (0xb736d000)
   libgsm.so.1 => /usr/lib/libgsm.so.1 (0xb7360000)
   libtheora.so.0 => /usr/lib/libtheora.so.0 (0xb7315000)
   libvorbisenc.so.2 => /usr/lib/libvorbisenc.so.2 (0xb721a000)
   libvorbis.so.0 => /usr/lib/libvorbis.so.0 (0xb71f0000)
   libavcodec.so.52 => /usr/lib/i686/cmov/libavcodec.so.52 (0xb6ab0000)
   /lib/ld-linux.so.2 (0xb7f85000)
   librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb6aa7000)
   libogg.so.0 => /usr/lib/libogg.so.0 (0xb6aa1000)
   libdirac_encoder.so.0 => /usr/lib/libdirac_encoder.so.0 (0xb6a0d000)
   libfaac.so.0 => /usr/lib/libfaac.so.0 (0xb69fb000)
   libfaad.so.0 => /usr/lib/libfaad.so.0 (0xb69bb000)
   libmp3lame.so.0 => /usr/lib/libmp3lame.so.0 (0xb6946000)
   libschroedinger-1.0.so.0 => /usr/lib/libschroedinger-1.0.so.0 (0xb68d6000)
   libx264.so.65 => /usr/lib/libx264.so.65 (0xb683f000)
   libxvidcore.so.4 => /usr/lib/libxvidcore.so.4 (0xb6726000)
   liboil-0.3.so.0 => /usr/lib/liboil-0.3.so.0 (0xb66b7000)
   libX11.so.6 => /usr/lib/libX11.so.6 (0xb65c8000)
   libxcb-xlib.so.0 => /usr/lib/libxcb-xlib.so.0 (0xb65c5000)
   libxcb.so.1 => /usr/lib/libxcb.so.1 (0xb65ac000)
   libXau.so.6 => /usr/lib/libXau.so.6 (0xb65a8000)
   libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb65a3000)

which shows libavcode, libavformat and lots of libraries needed by these.

The unixODBC driver manager does not need libavxxx stuff:

ken@ken-desktop:~$ ldd /usr/lib/libodbc.so.1
   linux-gate.so.1 =>  (0xb80bc000)
   libltdl.so.7 => /usr/lib/libltdl.so.7 (0xb8033000)
   libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb801a000)
   libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7ebb000)
   libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7eb7000)
   /lib/ld-linux.so.2 (0xb80bd000)

neither does the Oracle ODBC driver:

ken@ken-desktop:~$ ldd /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/lib/libsqora.so.10.1
   linux-gate.so.1 =>  (0xb7f71000)
   libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7eda000)
   libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7eb4000)
   libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7e9a000)
   libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0xb7e81000)
   libclntsh.so.10.1 => /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/lib/libclntsh.so.10.1 (0xb70cd000)
   libodbcinst.so.1 => /usr/lib/libodbcinst.so.1 (0xb70a9000)
   libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb6f4b000)
   /lib/ld-linux.so.2 (0xb7f72000)
   libnnz10.so => /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/lib/libnnz10.so (0xb6d45000)
   libltdl.so.7 => /usr/lib/libltdl.so.7 (0xb6d3c000)




There is another project in the same workspace, called 'tutorials', which is a set of demo programs for avcodec/avformat. I downloaded the c-sources and made a code::blocks project for them.

The mapfile for tutorials contains:

LOAD obj/Debug/tutorial01.o
LOAD /usr/lib/libSDL.so
LOAD /usr/lib/libSDL_image.so
LOAD /usr/lib/libavcodec.so.51
LOAD /usr/lib/libavformat.so.52

For tutorials the av libraries of course should be there. Is there any possibility of project cross-infection?

Is there a way of finding out why and where the av libraries are included, maybe via a more detailed linkmap or some other form of contents cross-reference?
 
What should be my next step?
 

rcoll:
Have you done a "clean" on the entire project, then tried to re-build?  The linkmap you showed us looks like a object file (that has not been re-built for a while) has those external references in it.

Ringo

Jenna:
Are you absolutely sure not to have any entries in the global linker options (in "Settings -> Compiler and debugger -> ....") ?

Navigation

[0] Message Index

[#] Next page

Go to full version