2010-06-05 83 views
1

因此,我正在努力想要找出这一个。这是我的基本设置:Boost :: OSX上的线程链接错误?

我正在编译一个共享库与一堆的核心功能,使用了很多提升的东西。我们将称这个库为libpf_core.so。它与boost静态库,特别是python,系统,文件系统,线程和program_options库链接。这一切都顺其自然。

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

当我去,虽然编译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特定的升压,我失踪了?在我搜索谷歌时,我看到一些其他人得到这个错误,但似乎没有人提出一个令人满意的解决方案。

编辑:想象一下,OSX在/ usr/local/include中带有boost 1.40。需要将我的版本的头文件放在某处,并确保我的插件首先看到这些头文件。

+1

发布您的解决方案作为答案然后接受它:) – 2010-06-14 14:06:10

+0

错误,你能详细说明你是如何解决它? – easytiger 2014-02-12 10:59:02

+0

现在已经过去4年了,但这听起来像是我用不同于系统版本的boost版本构建了我的核心库。我需要将不同版本的标题放在某处并设置我的包含路径,以便我的插件首先看到它们。 – 2014-02-12 14:49:10

回答

2

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

0

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

您需要将您的测试程序与boost库连接起来。你不能可靠地“链接”链接。

+0

嗯,这可能是问题,我试图链接libboost_thread-mt.a对插件以及虽然它并没有帮助。 10.5有一套包含它的boost库,我正在玩弄他们以某种方式冲突的概念。 – 2010-06-05 19:16:44