Accessing .so libraries using dlopen() throws undefined symbol error

后端 未结 4 1694
生来不讨喜
生来不讨喜 2021-02-04 09:55

I\'m trying to dynamically load a camera library .so file into a Linux executable to gain access to simple camera functions.

I\'m attempting to do this by:



        
4条回答
  •  一向
    一向 (楼主)
    2021-02-04 10:35

    I had a similar problem. It was to do with a .a library, which should have been linked to my .so and statically linked into the archive being left out.

    I determined this with (OP object name used here):

    nm mylibrary.so | grep ZTVN10_cxxabiv117__class_type_infoE
    0000ABC0 U ZTVN10_cxxabiv117__class_type_infoE
    

    The U here means that the symbol is "undefined". You can find the demangled name of the missing object with --demangle:

     $ nm --demangle mylibrary.so | grep 0000ABC0 
    0000ABC0 U abi::class_type_info(params...)
    

    (or something like that) this should help you figure out which library is missing.

    In my case, even after including the library on the compiler line I still had the issue. Eventually, after some tinkering I discovered that the library-file (.a) has to come after its dependent object (.o) file like:

    g++ -Wl,-E -g -m32 ... -fPIC myobjects1.o myobjects2.o missing_library.a -shared -o mylibrary.so
    

    Now I get (no more U):

     $ nm --demangle mylibrary.so | grep 0000ABC0 
    0000ABC0 T abi::class_type_info(params...)
    

    and most importantly I don't get the error any more!

提交回复
热议问题