【发布时间】: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 版本构建我的核心库。我需要将不同版本的标题放在某处并设置我的包含路径,以便我的插件首先看到它们。