Takhle:
target_link_libraries(your-target-name pthread boost_thread-mt etc)
Add_dependencies byste neměli používat, když chcete propojit knihovny. Propojení implikuje závislost, ale samotná závislost nebude dostatečná, když potřebujete propojit.
Bohužel neexistuje žádný přímý převod 1:1 z Makefiles do CMakeLists. Vzhledem k tomu, že CMake má běžet na všech platformách, nemůže se spoléhat na předpoklady specifické pro platformu, jako to dělá GNU make, což na určitých místech věci komplikuje.
CMake nabízí zejména velmi výkonný a poměrně složitý mechanismus pro použití knihoven:Zavoláte find_package se jménem vaší knihovny, což vyvolá skript pro vyhledávání knihoven z cesty vašeho modulu cmake. Tento skript (který je také napsán v CMake) se pokusí zjistit umístění záhlaví a souborů lib knihovny a uložit je do několika proměnných CMake, které pak lze předat příslušným příkazům CMake, jako jsou include_directories a target_link_libraries.
Tento přístup má dva problémy:Nejprve potřebujete vyhledávací skript. Naštěstí se CMake dodává s vyhledávacími skripty pro Pthreads, Boost a několik dalších, ale pokud používáte exotičtější knihovnu, možná si budete muset napsat vyhledávací skript sami, což je zpočátku trochu tajemný zážitek...
Druhým hlavním problémem je, že neexistuje žádný standardní způsob, jak by vyhledávací skript vrátil své výsledky. I když existují konvence pojmenování použitých proměnných, ty často neplatí. V praxi to znamená, že se budete muset podívat na zdroj vyhledávacího skriptu, abyste věděli, jak jej používat. Naštěstí jsou skripty dodávané s CMake většinou velmi dobře zdokumentované.
Vestavěné skripty jsou umístěny někde jako <cmake-install-prefix>/share/cmake-2.8/Modules
. Pro vaši otázku se podívejte na soubory FindBoost.cmake a FindThreads.cmake (CMake by se měl automaticky propojit se standardní knihovnou). Anycorn již poskytl nějaký ukázkový kód pro použití skriptu Boost, vše ostatní, co potřebujete vědět, je v dokumentaci CMake nebo přímo v souborech vyhledávacích skriptů.
S Boostem opravdu potřebujete použít vyhledávač balíčků
set(Boost_ADDITIONAL_VERSIONS "1.46" "1.46.0" "1.46.1")
set(Boost_USE_MULTITHREADED ON) # for -mt
find_package(Boost COMPONENTS thread)
if(Boost_FOUND)
MESSAGE(STATUS "Found Boost: ${Boost_LIBRARY_DIRS}")
MESSAGE(STATUS "Found Boost libraries: ${Boost_LIBRARIES}")
set(LIBRARIES "${LIBRARIES};${Boost_LIBRARIES}")
else()
MESSAGE(FATAL_ERROR "Boost Thread NOT FOUND")
endif()
target_link_libraries(executable ${LIBRARIES})