Fix the Error “error adding symbols: dso missing from command line”

C++ is a programming language that none of the programmers is unaware of. It is used to design or develop computer programs, operating systems, browsers, different games, etc. C++ gained popularity in a quick time after its launch. Different elements on a website can also be designed with C++, and that’s the reason even beginners are practicing learning it. When working, you may experience “error adding symbols: dso missing from command line”, which can halt the program you are working on.

It is obviously frustrating. But, no need to feel that. We are here to give you top-notch ideas and solutions to remove the error. Have a look at how the error occurs

How the error pops up

When you create a program, you get an error warning. Have a look at the program code

gcc -Wstrict-prototypes -Wall -Wno-sign-compare -Wpointer-arith
     -Wdeclaration-after-statement -Wformat-security -Wswitch-enum -Wunused-parameter -Wstrict-aliasing -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-field-initializers -Wno-override-init  -g -O2 -export-dynamic ***-lpthread***  -o utilities/ovs-dpctl utilities/ovs-dpctl.o lib/libopenvswitch.a
 /home/jyyoo/src/dpdk/build/lib/librte_eal.a
 /home/jyyoo/src/dpdk/build/lib/libethdev.a
 /home/jyyoo/src/dpdk/build/lib/librte_cmdline.a
 /home/jyyoo/src/dpdk/build/lib/librte_hash.a
 /home/jyyoo/src/dpdk/build/lib/librte_lpm.a
 /home/jyyoo/src/dpdk/build/lib/librte_mbuf.a
 /home/jyyoo/src/dpdk/build/lib/librte_ring.a
 /home/jyyoo/src/dpdk/build/lib/librte_mempool.a
 /home/jyyoo/src/dpdk/build/lib/librte_malloc.a -lrt -lm 
     /usr/bin/ld: /home/jyyoo/src/dpdk/build/lib/librte_eal.a(eal.o): undefined reference
     to symbol 'pthread_create@@GLIBC_2.2.5'
     /lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from 
     command line

You may have tried symbols that may look like this

$ readelf -s /lib/x86_64-linux-gnu/libpthread.so.0 | grep pthread_create
   199: 0000000000008220  2814 FUNC    GLOBAL DEFAULT   13 pthread_create@@GLIBC_2.2.5
   173: 0000000000008220  2814 FUNC    LOCAL  DEFAULT   13 __pthread_create_2_1
   462: 0000000000008220  2814 FUNC    GLOBAL DEFAULT   13 pthread_create@@GLIBC_2.2

This also results in the error warning. You must be wondering how to fix it. Have a look at the solutions to handle the exception

How to Fix the Error “error adding symbols: dso missing from command line”

The command line error shows up when you miss mentioning the library before compiling the object files.

Solution 1 – Add the library in the command line

The solution to fix the error in the simpler war, you need to make sure to add the library on your command line after compiling the object files. Take a look at the code

gcc -Wstrict-prototypes -Wall -Wno-sign-compare -Wpointer-arith -Wdeclaration-after-statement -Wformat-security -Wswitch-enum -Wunused-parameter -Wstrict-aliasing -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-field-initializers -Wno-override-init \
    -g -O2 -export-dynamic -o utilities/ovs-dpctl utilities/ovs-dpctl.o \
    lib/libopenvswitch.a \
    /home/jyyoo/src/dpdk/build/lib/librte_eal.a /home/jyyoo/src/dpdk/build/lib/libethdev.a /home/jyyoo/src/dpdk/build/lib/librte_cmdline.a /home/jyyoo/src/dpdk/build/lib/librte_hash.a /home/jyyoo/src/dpdk/build/lib/librte_lpm.a /home/jyyoo/src/dpdk/build/lib/librte_mbuf.a /home/jyyoo/src/dpdk/build/lib/librte_ring.a /home/jyyoo/src/dpdk/build/lib/librte_mempool.a /home/jyyoo/src/dpdk/build/lib/librte_malloc.a \
    -lrt -lm -lpthread

The linkage relies on the module’s order. Firstly, symbols are requested and later linked in from a library. Modules have to be specified that use the library before and after. It must be like the following

gcc x.o y.o z.o -la -lb -lc

Solution 2 – For Ubuntu

To solve the error for Ubuntu, follow the below code

For Ubuntu Raring

/usr/bin/ld: note: 'uncompress' is defined in DSO /lib/x86_64-linux-gnu/libz.so.1 so try adding it to the linker command line

For Ubuntu Saucy

/usr/bin/ld: /mnt/root/ffmpeg-2.1.1//libavformat/libavformat.a(http.o): undefined reference to symbol 'inflateInit2_'
/lib/x86_64-linux-gnu/libz.so.1: error adding symbols: DSO missing from command line

Conclusion

We have highlighted the solutions to fix the error “error adding symbols: dso missing from command line”. These solutions can remove the error and let you code the program the way you want. I wish you luck!

Reference Source: https://www3.risc.jku.at/education/courses/ws2003/intropar/origin-new/MproCplrDbx_TG/sgi_html/ch03.html

https://zhangboyi.gitlab.io/post/2020-09-14-resolve-dso-missing-from-command-line-error/

Posted in C++

Leave a Reply

Your email address will not be published. Required fields are marked *