【问题标题】:C++ Symbol lookup error in shared library when accessing boost bind访问 boost 绑定时共享库中的 C++ 符号查找错误
【发布时间】:2014-01-27 19:35:08
【问题描述】:

我正在尝试将多线程添加到我的库中,因此我正在为我的库创建一个线程执行器。为此,我使用了 boost 线程。

这是我在运行链接到库的测试用例时遇到的错误:

symbol lookup error: libmylibexample.so.0: undefined symbol: _ZTVN5boost6detail16thread_data_baseE

这是我的共享库中导致错误的代码行:

MyNameSpace::Producer producer = MyNameSpace::Producer();
threads.create_thread(boost::bind(&MyNameSpace::Producer::run, &producer));

我正在使用 autotools 和 libtool 编译库。代码编译得很好。然后我创建一个我试图引用该库的测试用例。下面是编译测试用例的编译顺序:

g++ -I.  -I../include -g -O2 -MT runTest-runTest.o -MD -MP -MF .deps/runTest-runTest.Tpo -c -o runTest-runTest.o `test -f 'runTest.cc' || echo './'`runTest.cc

这是我的链接阶段:

mv -f .deps/runTest-runTest.Tpo     .deps/runTest-runTest.Po

/bin/bash ../libtool --tag=CXX   --mode=link g++  -g -O2 ../libmylibexample/libmylibexample.la   -o runTest runTest-runTest.o -lboost_system -lboost_filesystem -lboost_regex -lboost_thread-mt -lfftw3 -ltiff

libtool: link: g++ -g -O2 -o .libs/runTest runTest-runTest.o  ../libmylibexample/.libs/libmylibexample.so -lboost_system -lboost_filesystem -lboost_regex -lboost_thread-mt -lfftw3 /usr/lib/x86_64-linux-gnu/libtiff.so

我的一位同事建议初始化一些与线程相关的 boost 模板,以帮助共享库从 boost_thread 库中加载符号。我不完全确定最好的方法来做到这一点,如果这是让事情被加载的正确方法。

总结一下:错误似乎涉及无法从我的共享库中加载 libboost_thread 中定义的符号。

【问题讨论】:

    标签: c++ shared-libraries boost-thread libtool


    【解决方案1】:

    如错误所示,您需要将libmylibexamplelibboost_thread 链接。

    【讨论】:

    • 是的,我看到您在runTest 的链接步骤中都有它们。但是,您需要在未显示的链接步骤中使用-lboost_thread-lboost_thread-mt - libmylibexample 的链接步骤。
    • 在我的链接阶段,我确实添加了两个库../libmylibexample/.libs/libmylibexample.so-lboost_thread-mt ...我也尝试过-lboost_thread ...除非在编译库时有办法添加此链接本身......(必须阅读。)我将编辑我的帖子以包括图书馆的创建。没有意识到在创建共享库本身时我必须链接库。通常我将所有库链接在一起,用于使用所有库的主应用程序。
    • 好的,我将 boost_thread 库添加到我的共享库中,一切正常!感谢您的帮助!我在创建共享库方面非常陌生,尤其是在使用 boost 时。再次感谢!
    • 当链接 共享​​> 库 (DSO) 时,通常不需要将主应用程序链接到 所有 依赖库,只需链接到它的库直接使用。正如您所发现的,每个共享库都必须链接到它的直接依赖项,因此它可以在运行时加载。在 static 链接模型中,将主应用程序与其所有依赖库链接是必需的,并且就像您拥有的那样。
    猜你喜欢
    • 1970-01-01
    • 2017-08-02
    • 2018-06-14
    • 2010-11-09
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    相关资源
    最近更新 更多