2012-11-13 53 views
2

我已经set(Boost_USE_MULTITHREADED ON)但它仍然不使用-mt库。cmake不使用提升多线程库

cmake_minimum_required(VERSION 2.6) 
PROJECT(app) 
set(Boost_USE_MULTITHREADED ON) 
FIND_PACKAGE(Boost COMPONENTS filesystem program_options thread serialization REQUIRED) 
ADD_EXECUTABLE(app long_list_of_files) 
TARGET_LINK_LIBRARIES(app ${Boost_LIBRARIES}) 

我可以看到序列化过程只使用一个CPU核心(100%),而不使用其他核心。也LDD不显示经由螺纹-mt

linux-gate.so.1 => (0xb781f000) 
libboost_filesystem.so.1.42.0 => /usr/lib/libboost_filesystem.so.1.42.0 (0xb77e9000) 
libboost_program_options.so.1.42.0 => /usr/lib/libboost_program_options.so.1.42.0 (0xb7795000) 
libboost_thread.so.1.42.0 => /usr/lib/libboost_thread.so.1.42.0 (0xb7780000) 
libpthread.so.0 => /lib/libpthread.so.0 (0xb7766000) 
libboost_serialization.so.1.42.0 => /usr/lib/libboost_serialization.so.1.42.0 (0xb76f3000) 
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7608000) 
libm.so.6 => /lib/libm.so.6 (0xb75e2000) 
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb75c5000) 
libc.so.6 => /lib/libc.so.6 (0xb7468000) 
libboost_system.so.1.42.0 => /usr/lib/libboost_system.so.1.42.0 (0xb7463000) 
librt.so.1 => /lib/librt.so.1 (0xb745a000) 
/lib/ld-linux.so.2 (0xb7820000) 
+0

你对'ls -l/usr/lib/libboost_thread-mt.so'的输出得到了什么? –

+0

是的文件存在'lrwxrwxrwx 1 root root 25 2012-01-27 21:43 /usr/lib/libboost_thread-mt.so - > libboost_thread.so.1.42.0' –

+0

所以你得到正确的版本。 ldd会向您显示它正在使用的实际共享对象,而不是它的符号链接。 –

回答

4

升压序列化的目的是提供线程安全的,但不同时序列化。

通过软件包管理器安装Boost时,通常会在/usr/lib中找到库别名,这些库别名将库的名称映射为规范的名称。在Boost的情况下,“tagged”名称包含通过-mt后缀的多线程能力。

ldd仅显示CMake在调用链接器时使用的名称,它是规范链接器,而不是后缀为*-mt的详细链接器。因为您的Boost软件包安装涉及创建形式符号链接

/usr/lib/libboost_thread-mt.so -> libboost_thread.so.1.42.0 

您不应该担心链接错误的库。

实际上,Boost Serialization不会自行生成线程,所以您不应该只通过使用库来看到线程数量的增加。在内部,序列化库使用互斥锁来保护共享指针的计数器。