2012-07-27 10 views
6

Mam projekt CMake, który czasami chcę skompilować przeciwko statycznym bibliotekom boost, ale chcę również ułatwić korzystanie z dynamicznych bibliotek z GUI cmake. W moim najwyższym poziomie CMakeLists.txt mam to:Jak mogę opcjonalnie połączyć się ze statyczną lub dynamiczną biblioteką doładowania za pomocą CMake?

option(USE_STATIC_BOOST "Build with static BOOST libraries instead of dynamic" NO) 

Następnie w innym pliku, mam następujący logiczny skonfigurować:

if(USE_STATIC_BOOST) 
    unset(Boost_LIBRARIES) 
    message(WARNING "Linking against boost static libraries") 
    set(Boost_USE_STATIC_LIBS ON) 
    set(Boost_USE_MULTITHREADED ON) 
    find_package(Boost REQUIRED COMPONENTS thread program_options system) 
else(USE_STATIC_BOOST) 
    unset(Boost_LIBRARIES) 
    message(WARNING "Linking against boost dynamic libraries") 
    set(Boost_USE_STATIC_LIBS OFF) 
    set(Boost_USE_MULTITHREADED ON) 
    find_package(Boost REQUIRED COMPONENTS thread program_options system) 
endif(USE_STATIC_BOOST) 

To wydaje się działać prawidłowo, jeśli zacznę od podstaw i używać:

cmake ../.. -DUSE_STATIC_BOOST=YES 

jednak kiedy używam

ccmake ../.. 

Nie mogę go użyć do korzystania z bibliotek statycznych bez względu na to, co robię. Wydaje się, że CMake załadował opcję dynamiczną do pamięci podręcznej podczas uruchamiania i zmiana USE_STATIC_BOOST go nie zmienia. Próbowałem nawet usunąć ustawienie (Boost_LIBRARIES), aby jawnie je usunąć. Czy istnieje sposób, aby zrobić to, co próbuję zrobić?

Użycie x86_64 Linux i g ++ do kompilacji. Z góry dziękuję!

Odpowiedz

11

Aby zmusić moduł FindBoost CUpewnij do wyszukiwania pożądanych bibliotekach ponownie, trzeba usunąć zmienne cache Boost_INCLUDE_DIR i Boost_LIBRARY_DIRS, tj:

set(Boost_USE_STATIC_LIBS ${USE_STATIC_BOOST}) 
set(Boost_USE_MULTITHREADED ON) 
unset(Boost_INCLUDE_DIR CACHE) 
unset(Boost_LIBRARY_DIRS CACHE) 
find_package(Boost REQUIRED COMPONENTS thread program_options system) 
if(USE_STATIC_BOOST) 
    message(STATUS "Linking against boost static libraries") 
else(USE_STATIC_BOOST) 
    message(STATUS "Linking against boost dynamic libraries") 
endif(USE_STATIC_BOOST) 

Należy zauważyć, że argument CACHE jest konieczne, aby dowodzić unset wyczyść zmienne w pamięci podręcznej.

Należy również pamiętać, że raz opcją zmienna USE_STATIC_BOOST został buforowane, należy jawnie ustawić zmienną z linii poleceń lub edycji wartości w pliku pamięci podręcznej, aby CUpewnij zauważyć zmiany:

cmake ../.. -DUSE_STATIC_BOOST=NO 
+1

doskonały - to działało świetnie, dzięki! Pytanie uzupełniające: Czy wiesz, dlaczego ustawienie Boost_USE_STATIC_LIBS na ON/OFF musi się odbywać w tym samym zakresie co pakiet find_? Jeśli wyjmę pakiet find_out z powyższego bloku if/else/endif, nie będzie on honorował flagi Boost_USE_STATIC_LIBS. – KyleL

+0

@KdawgUD Działa to dla mnie, nawet jeśli zasięg nie jest taki sam. W każdym razie można uniknąć większości powielania kodu w instrukcji if-else (patrz zaktualizowana odpowiedź). – sakra

+0

Jeszcze raz dziękuję za pomoc. Być może walczyłem z problemem z pamięcią podręczną, kiedy widziałem, co uważałem za problem z zasięgiem. Przyjąłem twoją sugestię, aby usunąć zduplikowany kod. Twoje zdrowie! – KyleL

Powiązane problemy