所以我很想搞清楚这一点。这是我的基本设置:
我正在编译一个共享库,其中包含许多使用大量增强功能的核心功能。我们将此库称为libpf_core.so。它与boost静态库链接,特别是python,系统,文件系统,线程和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是否有关于提升的具体内容我缺少?在我搜索谷歌时,我看到其他一些人得到了这个错误,但似乎没有人提出一个令人满意的解决方案。
编辑:想出来,OSX在/ usr / local / include中带有boost 1.40。需要在某处为我的boost版本添加标题,并确保我的插件首先看到它们。
答案 0 :(得分:2)
您需要链接到libboost_thread
。添加-lboost_thread
开关。
答案 1 :(得分:0)
当你将libpf_core.so链接到静态boost库时,它只会获得它实际使用的函数的副本。链接器无需提取库中代码未引用的函数。
您还需要将测试程序与boost库链接起来。你无法可靠地“链接”这些联系。