jae*_*ong 188 linker gcc compiler-errors undefined-reference
当我编译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
Run Code Online (Sandbox Code Playgroud)
如果我试着看到它的符号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
Run Code Online (Sandbox Code Playgroud)
你能给出任何提示或指示吗?
Mic*_*kov 147
在编译目标文件后,您应该在命令行中提到库:
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
Run Code Online (Sandbox Code Playgroud)
说明:链接取决于模块的顺序.首先请求符号,然后从具有它们的库链接.因此,您必须首先指定使用库的模块,然后指定库.像这样:
gcc x.o y.o z.o -la -lb -lc
Run Code Online (Sandbox Code Playgroud)
此外,如果存在循环依赖关系,则应在命令行上多次指定相同的库.因此,如果libb需要符号来自libc且libc需要符号来自libb,命令行应该是:
gcc x.o y.o z.o -la -lb -lc -lb
Run Code Online (Sandbox Code Playgroud)
kev*_*inf 47
错误消息取决于分发/编译器版本:
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
解决方案:在链接阶段,您可能在编译步骤中缺少库.在我的例子中,我将'-lz'添加到makefile/GCC标志中.
背景: DSO是动态共享对象或共享库.
tex*_*ell 38
背景
DSO missing from command line当链接器通过正常搜索未找到所需符号但该符号在直接指定的动态库的依赖项之一中可用时,将显示该消息。
过去,链接器认为特定语言的依赖项中的符号可用。但是在以后的版本中这种情况发生了变化,现在链接器对可用内容实施了更严格的视图。因此,该消息旨在帮助实现这一转变。
该怎么办?
如果您是软件的维护者
您应该通过确保在链接器命令行上直接指定满足所需符号所需的所有库来解决此问题。还要记住,顺序通常很重要。
如果你只是想编译软件
作为一种解决方法,可以使用选项切换回更宽松的可用符号视图-Wl,--copy-dt-needed-entries。
将其注入构建的常用方法是在运行之前导出 LDFLAGSconfigure或类似如下:
export LDFLAGS="-Wl,--copy-dt-needed-entries"
Run Code Online (Sandbox Code Playgroud)
有时LDFLAGS="-Wl,--copy-dt-needed-entries"直接传递到make也可能有效。
Eth*_*ris 14
我找到了另一个案例,因此我认为你错了.
这就是我所拥有的:
/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
Run Code Online (Sandbox Code Playgroud)
问题是命令行DID不包含-lX11- 尽管libX11.so应该作为依赖项添加,因为参数中还有GTK和GNOME库.
所以,对我来说唯一的解释是这条消息可能是为了帮助你,但它并没有正确地做到这一点.这可能很简单:提供符号的库未添加到命令行.
请注意有关POSIX中的链接的三个重要规则:
-l<name>,您永远不知道它是否需要lib<name>.so或lib<name>.a.如果找到动态库,则首选动态库,并且只能通过编译器选项强制执行静态库 - 这就是全部.如果你有任何问题,这取决于你是否有静态或动态库小智 7
我发现我有同样的错误.我正在用lapack和blas编译代码.当我切换两个库被调用的顺序时,错误就消失了.
"LAPACK_LIB = -llapack -lblas"工作,其中"LAPACK_LIB = -lblas -llapack"给出了上述错误.
如果您使用 CMake,有一些方法可以解决这个问题:
方案一:最优雅的方案
add_executable(...)
target_include_directories(...)
target_link_libraries(target_name pthread)
Run Code Online (Sandbox Code Playgroud)
解决方案2:使用CMakefind_package
find_package(Threads REQUIRED) # this will generate the flag for CMAKE_THREAD_LIBS_INIT
add_executable(...)
target_include_directories(...)
target_link_libraries(target_name ${CMAKE_THREAD_LIBS_INIT})
Run Code Online (Sandbox Code Playgroud)
解决方案 3:更改 CMake 标志
# e.g. with C++ 17, change to other version if you need
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -pthread")
Run Code Online (Sandbox Code Playgroud)
我也遇到同样的问题。我不知道为什么,我只是添加-lpthread选项到编译器,一切正常。
旧:
$ g++ -rdynamic -m64 -fPIE -pie -o /tmp/node/out/Release/mksnapshot ...*.o *.a -ldl -lrt
Run Code Online (Sandbox Code Playgroud)
出现以下错误。如果我将-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
Run Code Online (Sandbox Code Playgroud)