当我编译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

你能给我一些提示或指点吗?


当前回答

如果您正在使用cmake和使用过的pthread,请尝试添加以下行

find_package(Threads)
target_link_libraries(${CMAKE_THREAD_LIBS_INIT})

其他回答

背景

当链接器在正常搜索中没有找到所需的符号,但该符号在直接指定的动态库的依赖项之一中可用时,命令行消息将显示DSO missing。

在过去,链接器认为具有特定语言依赖关系的符号是可用的。但在后来的一些版本中,这种情况发生了变化,现在链接器对可用内容执行了更严格的视图。因此,这一信息旨在帮助实现这一转变。

怎么办呢?

如果您是软件的维护者

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

如果你只是想编译软件

作为一种变通方法,可以使用选项-Wl,——copy-dt-needed-entries切换回更宽松的视图来查看可用的符号。

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

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

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

错误信息取决于发行版/编译器版本:

Ubuntu漂亮的:

/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

解决方案:在链接阶段,您可能会在编译步骤中丢失一个库。在我的例子中,我在makefile / GCC标志中添加了'-lz'。

背景:DSO是一个动态共享对象或共享库。

你应该在目标文件被编译后在命令行中提到这个库:

 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

同样的问题发生在我使用distcc做我的c++项目; 最后我用export CXX="distcc g++"解决了它。

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