11 题: libpthread.so.0:添加符号时出错:命令行中缺少DSO

在...创建的问题 Thu, Mar 28, 2019 12:00 AM

当我编译openvswitch-1.5.0时,我遇到了以下编译错误:

 
 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

如果我试图看到libpthread的符号,它看起来很好。

 
$ 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

你能给出任何提示或指示吗?

    
173
  1. 2017-01-09 20:47:31Z
  2. link_libraries(pthread)
    2017-05-10 11:53:20Z
  3. #readelf -s /lib/x86_64-linux-gnu/libncurses.so readelf:错误:找不到'/lib /x86_64-linux-gnu /libncurses。所以'。系统错误消息:符号链接的级别太多
    2017-10-17 10:29:09Z
  4. 2017-12-12 09:21:39Z
  5. Goddamnit,我做了gcc而不是g++
    2018-06-14 18:44:25Z
  6. 醇>
    11答案                              11 跨度>                         

    在正在编译的目标文件之后,您应该在命令行上提到该库:

     
     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 
    

    说明:链接取决于模块的顺序。首先请求符号,然后从具有它们的库链接。因此,您必须首先指定使用库的模块,然后指定库。像这样:

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

    此外,如果存在循环依赖关系,则应在命令行上多次指定相同的库。因此,如果libb需要来自libc的符号而libc需要来自libb的符号,则命令行应为:

     
    gcc x.o y.o z.o -la -lb -lc -lb
    
        
    132
    2015-12-21 15:04:04Z
    1. 我认为你可以为循环依赖做-Wl,--start-group -la -lb- -lc -Wl,--end-group
      2014-10-28 13:02:19Z
    2. 注意这也适用于源文件 - 它们应该在库之前列出。您可以将生成的目标文件视为在命令行中取代源文件,并应用与上面相同的顺序。
      2015-01-10 22:26:27Z
    3. 使用make构建应用程序时,应该在哪里添加-lpthread?
      2016-08-08 07:08:15Z
    4. 醇>

    错误消息取决于分发/编译器版本:

    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
    

    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
    

    解决方案:在链接阶段,您可能在编译步骤中缺少库。在我的例子中,我将'-lz'添加到makefile /GCC标志。

    后台: DSO是动态共享对象或共享库。

        
    45
    2018-05-16 05:46:37Z
    1. 我使用这个解决方案构建另一个项目,通过向LDFLAGS添加-lz来提供相同的错误,并且它工作得很好。谢谢!
      2014-04-14 14:59:46Z
    2. 错误仍然存​​在:/usr /bin /ld:gaSim.o:对符号'pthread_create @@ GLIBC_2.1'/lib /i386-的未定义引用linux-gnu /libpthread.so.0:添加符号时出错:命令行中缺少DSO
      2014-06-26 08:51:52Z
    3. 部分解决了添加'-lpthread',但现在它显示了我:gaSim.c :(。text + 0x11d6):未定义引用`glewInit'
      2014-06-26 08:53:56Z
    4. @ Aerox:for glewInit,你需要-lGLEW
      2016-08-02 18:07:44Z
    5. 醇>

    我找到了另一个案例,因此我认为你错了。

    这就是我所拥有的:

     
    /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: eggtrayicon.o: undefined reference to symbol 'XFlush'
    /usr/lib64/libX11.so.6: error adding symbols: DSO missing from command line
    

    问题是命令行DID不包含-lX11 - 尽管libX11.so应该作为依赖项添加,因为参数中还有GTK和GNOME库。

    因此,对我来说唯一的解释是此消息可能是为了帮助您,但它没有正确执行。这可能很简单:提供符号的库未添加到命令行。

    请注意有关POSIX中链接的三条重要规则:

    • 动态库已定义了依赖项,因此只应以任何顺序提供顶级依赖项中的库(尽管在静态库之后)
    • 静态库只有未定义的符号 - 由您来了解它们的依赖关系并在命令行中提供所有这些符号
    • 静态库中的顺序始终为:请求者提供商跟随。否则,您将获得未定义的符号消息,就像您忘记将库添加到命令行一样
    • 当您使用-l<name>指定库时,您永远不知道是否需要lib<name>.solib<name>.a。如果找到动态库,则首选动态库,并且只能通过编译器选项强制执行静态库 - 这就是全部。如果你有任何问题,这取决于你是否有静态或动态库
    • 好吧,有时动态库中可能缺少依赖关系:D
    14
    2016-07-14 13:34:08Z
    1. 它不仅旨在帮助您,链接器还需要解析相关名称。该错误完全有效。如果编译器决定让它通过,你只需要获得一个段错误来访问二进制运行时中没有的东西。
      2018-01-25 03:16:29Z
    2. 要添加,可能在不同的平台上,源的编译方式不同;在一个系统上链接的内容可能不会在另一个系统上链接。通常情况并非如此,但它是100%合理的。
      2018-01-25 03:17:59Z
    3. 问题不在于它无效,而是找到问题原因并不是很有帮助。
      2019-01-09 11:04:27Z
    4. 醇>

    我发现我有同样的错误。我正在用lapack和blas编译代码。当我切换两个库被调用的顺序时,错误就消失了。

    “LAPACK_LIB = -llapack -lblas”在哪里工作 “LAPACK_LIB = -lblas -llapack”给出了上述错误。

        
    6
    2013-12-17 19:30:29Z
    1. 我在一个cmake定义的项目中得到这个错误...所以Cmake中是否存在一个错误,导致链接器顺序错误?
      2015-01-20 22:10:57Z
    2. 回复@peterkarasev:尝试使用find_package(Threads)target_link_libraries( ... ${CMAKE_THREAD_LIBS_INIT})
      2018-06-29 21:20:44Z
    3. 醇>

    我也遇到过同样的问题。我不知道为什么,我只是为编译器添加了-lpthread选项,一切正常。

    旧:

     
    $ g++ -rdynamic -m64 -fPIE -pie  -o /tmp/node/out/Release/mksnapshot ...*.o *.a -ldl -lrt
    

    出现以下错误。如果我将-lpthread选项附加到上面的命令,那么确定。

     
    /usr/bin/ld: /tmp/node/out/Release/obj.host/v8_libbase/deps/v8/src/base/platform/condition-variable.o: undefined reference to symbol 'pthread_condattr_setclock@@GLIBC_2.3.3'
    //lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
    collect2: error: ld returned 1 exit status
    
        
    4
    2016-08-29 16:43:32Z

    我发现有时链接器抱怨的库不是引起问题的库。可能有一种聪明的方法来解决问题所在,但这就是我所做的:

    • 注释掉link命令中的所有链接库。
    • 清除所有.o,.so等(通常make clean就足够了,但你可能想要运行递归的find + rm,或类似的东西)。
    • 一次取消注释链接命令中的库,并根据需要重新排列顺序。

    @peter karasev:我在CentOS7上遇到了与gcc 4.8.2 cmake项目相同的问题。 “target_link_libraries”部分中的库的顺序很重要。我猜cmake只是按顺序将列表传递给链接器,即它不会尝试找出正确的顺序。这是合理的 - 当你考虑它时,cmake无法知道正确的顺序是什么,直到链接成功完成。

        
    2
    2015-02-05 09:31:04Z

    请添加:CFLAGS="-lrt"LDFLAGS="-lrt"

        
    2
    2017-04-13 08:26:45Z

    当我使用distcc制作我的c ++项目时,同样的问题发生在我身上; 最后我用export CXX="distcc g++"解决了它。

        
    1
    2018-02-09 04:24:54Z

    背景强>

    当链接器找不到正常搜索所需的符号但是该符号在直接指定的动态库的某个依赖项中可用时,将显示DSO missing from command line消息。

    在过去,链接器认为指定语言的依赖关系中的符号是可用的。但是在稍后的版本中发生了变化,现在链接器对可用内容进行了更严格的查看。因此,该消息旨在帮助实现这种转变。

    怎么做?

    如果您是该软件的维护者

    您应该通过确保在链接器命令行上直接指定满足所需符号所需的所有库来解决此问题。还要记住,订单通常很重要。

    如果您只是想编译软件

    作为一种解决方法,可以使用选项-Wl,--copy-dt-needed-entries切换回更宽松的可用符号视图。

    将此注入构建的常用方法是在运行configure之前导出LDFLAGS或类似的:

     
    export LDFLAGS="-Wl,--copy-dt-needed-entries"
    

    有时将LDFLAGS="-Wl,--copy-dt-needed-entries"直接传递给make也可能有效。

        
    1
    2019-03-10 10:18:34Z

    当我安装HPCC基准测试时(包括HPL和其他一些基准测试),我发生了同样的事情。我在构建脚本中将-lm添加到编译器标志中,然后成功编译。

        
    0
    2016-12-04 18:41:04Z
    1. 这既不回答这个具体问题,也不对一系列类似问题给出一般答案。对于完全的另一个问题,这是一个高度本地化的答案。
      2016-12-04 19:10:3​​9Z
    2. 醇>

    如果使用g++,请确保您没有运行gcc

        
    0
    2018-06-21 22:46:04Z
    1. 为什么?你能详细说一下吗?
      2019-03-14 13:42:10Z
    2. 醇>
来源放置 这里