【问题标题】:Boost::Thread linking error on OSX?Boost :: OSX上的线程链接错误?
【发布时间】:2010-06-05 19:01:41
【问题描述】:

所以我要疯了,试图弄清楚这一点。这是我的基本设置:

我正在编译一个包含大量核心功能的共享库,这些核心功能使用了大量的增强功能。我们将此库称为 libpf_core.so。它与 boost 静态库链接,特别是 python、system、filesystem、thread 和 program_options 库。这一切都很顺利。

现在,我有一个名为 test_socketio 的小测试程序,它被编译成一个共享库(它在运行时作为插件加载)。它使用了一些 boost::bind 和 boost::thread 之类的东西,并且再次链接了 libpf_core.so(记住了其中包含的 boost 库)。

不过,当我去编译 test_socketio 时,在我所有的插件中,它给了我一个链接错误:

[ Building test_socketio ]
g++ -c -pg -g -O0  -I/usr/local/include -I../include test_socketio.cc -o test_socketio.o
g++ -shared test_socketio.o -lpy_core  -o test_socketio.so
Undefined symbols:
  "boost::lock_error::lock_error()", referenced from:
      boost::unique_lock<boost::mutex>::lock()   in test_socketio.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

我快要疯了,想弄清楚为什么会这样。我已经尝试将 boost::thread 显式链接到插件中但无济于事,并尝试确保我正在使用与链接到 libpf_core.so 的库关联的 boost 标头,以防出现冲突。

我缺少一些关于提升的特定于 OSX 的东西吗?在我在 google 上搜索时,我看到许多其他人收到此错误,但似乎没有人提出令人满意的解决方案。

编辑:想通了,OSX 在 /usr/local/include 中带有 boost 1.40。需要将我的 boost 版本的标题放在某个地方,并确保我的插件首先看到这些标题。

【问题讨论】:

  • 发布您的解决方案作为答案,然后接受它:)
  • Err,你能详细说明你是如何解决的吗?
  • 现在已经有 4 年了,但听起来我正在使用与系统版本不同的 boost 版本构建我的核心库。我需要将不同版本的标题放在某处并设置我的包含路径,以便我的插件首先看到它们。

标签: c++ macos boost


【解决方案1】:

您需要链接到libboost_thread。添加-lboost_thread 开关。

【讨论】:

    【解决方案2】:

    当您将 libpf_core.so 链接到静态 boost 库时,它只会获取它实际使用的函数的副本。链接器不会费心拉入库中的代码未引用的函数。

    您还需要将您的测试程序与 boost 库相关联。您不能可靠地“链接”链接。

    【讨论】:

    • 嗯,这可能是问题所在,我也尝试将 libboost_thread-mt.a 与插件链接起来,但没有帮助。 10.5 包含一组 boost 库,我正在玩弄它们以某种方式发生冲突的概念。
    猜你喜欢
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 2013-02-26
    相关资源
    最近更新 更多