2012-11-13 103 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不會自行生成線程,所以您不應該只通過使用庫來看到線程數量的增加。在內部,序列化庫使用互斥鎖來保護共享指針的計數器。