2012-04-03 20 views
13

Chcę użyć cmake do wygenerowania moich plików kompilacji dla projektu C++. Mam istniejący Makefile. Mam problemy z generowaniem tego Makefile przy użyciu standardowej składni cmake.Tworzenie pliku CMakeLists z istniejącego pliku Makefile

Jak dodać standardowe biblioteki C++, takie jak -lstdc++ -lpthread -lboost_thread-mt w sekcji TARGET_LINK_LIBRARIES z cmake? A może te pliki powinny być zawarte w sekcji ADD_DEPENDENCIES.

(OR) Czy jest to proste narzędzie, które generuje z Makefile

Odpowiedz

9

Niestety, nie ma bezpośredni 1: 1 konwersja z Makefile do CMakeLists. Ponieważ CMake ma działać na wszystkich platformach, nie może opierać się na specyficznych dla platformy założeniach, takich jak GNU make czy, co komplikuje pewne rzeczy w niektórych miejscach.

W szczególności CMake oferuje bardzo potężny i dość złożony mechanizm korzystania z bibliotek: Wywołujesz find_package z nazwą biblioteki, która wywoła skrypt wyszukiwania biblioteki ze ścieżki twojego modułu cmake. Ten skrypt (również zapisany w CMake) spróbuje wykryć lokalizację plików nagłówkowych i lib biblioteki i przechowywać je w kilku zmiennych CMake, które następnie mogą zostać przekazane do odpowiednich poleceń CMake, takich jak include_directories i target_link_libraries.

Istnieją dwa problemy z tym podejściem: Po pierwsze, potrzebujesz skryptu wyszukiwania. Na szczęście CMake jest dostarczany ze skryptami wyszukiwania dla Pthreads, Boost i kilku innych, ale jeśli używasz bardziej egzotycznej biblioteki, być może będziesz musiał sam napisać skrypt wyszukiwania, co z początku jest rodzajem arcane ...

Drugi poważny problem polega na tym, że nie ma standardowego sposobu, aby skrypt wyszukiwania zwrócił wyniki. Chociaż istnieją konwencje nazewnictwa dla używanych zmiennych, te często nie mają zastosowania. W praktyce oznacza to, że musisz sprawdzić źródło skryptu wyszukiwania, aby dowiedzieć się, jak z niego korzystać. Na szczęście skrypty dołączone do CMake są w większości bardzo dobrze udokumentowane.

Wbudowane skrypty znajdują się gdzieś w rodzaju <cmake-install-prefix>/share/cmake-2.8/Modules. Na twoje pytanie spójrz na pliki FindBoost.cmake i FindThreads.cmake (CMake powinien automatycznie łączyć się z biblioteką standardową). Anycorn już dał przykładowy kod do użycia skryptu Boost, wszystko, co musisz wiedzieć, znajduje się w dokumentacji CMake lub bezpośrednio w plikach skryptów wyszukiwania.

2

Ci się ten plik CMakeList.txt:

target_link_libraries(your-target-name pthread boost_thread-mt etc) 

Nie należy stosować add_dependencies gdy chcesz połączyć bibliotek. Łączenie implikuje zależność, ale sama zależność nie wystarczy, gdy trzeba połączyć.

2

Z Boost, naprawdę trzeba użyć pakietu Finder

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}) 
Powiązane problemy