2012-04-03 14 views
13

Desidero utilizzare cmake per generare i miei file di build per un progetto C++. Ho uno Makefile esistente. Ho problemi con la generazione di questo Makefile utilizzando la sintassi standard cmake.Creazione del file CMakeLists dal Makefile esistente

In che modo è possibile includere librerie C++ standard come -lstdc++ -lpthread -lboost_thread-mt nella sezione TARGET_LINK_LIBRARIES di cmake? O questi file dovrebbero essere inclusi nella sezione ADD_DEPENDENCIES.

(OR) Esiste un semplice strumento che genera un file CMakeList.txt da un Makefile

risposta

9

Purtroppo, non v'è alcuna diretta 1: 1 conversione da Makefiles a CMakeLists. Poiché CMake dovrebbe funzionare su tutte le piattaforme, non può basarsi su ipotesi specifiche della piattaforma come fa GNU make, il che complica le cose in certi punti.

In particolare, CMake offre un meccanismo molto potente e piuttosto complesso per l'utilizzo delle librerie: si chiama find_package con il nome della libreria, che invocherà uno script di ricerca della libreria dal percorso del modulo cmake. Questo script (che è anche scritto in CMake) tenterà di rilevare la posizione dell'intestazione della libreria e dei file lib e di memorizzarli in un paio di variabili CMake che possono essere passate ai comandi CMake corrispondenti come include_directory e target_link_libraries.

Ci sono due problemi con questo approccio: in primo luogo, è necessario uno script di ricerca. Fortunatamente, CMake viene fornito con script di ricerca per Pthreads, Boost e un paio di altri, ma se si utilizza una libreria più esotica, potrebbe essere necessario scrivere lo script di ricerca da sé, che è una specie di esperienza arcana all'inizio ...

Il secondo problema principale è che non esiste un modo standard per uno script di ricerca per restituire i risultati. Mentre ci sono convenzioni di denominazione per le variabili utilizzate, quelle spesso non si applicano. In pratica ciò significa che dovrai controllare la fonte di uno script di ricerca per sapere come usarlo. Fortunatamente, gli script che vengono con CMake sono per lo più ben documentati.

Gli script incorporati si trovano da qualche parte come <cmake-install-prefix>/share/cmake-2.8/Modules. Per la tua domanda, guarda i file FindBoost.cmake e FindThreads.cmake (CMake dovrebbe collegarsi automaticamente con la libreria standard). Anycorn ha già fornito un codice di esempio per l'utilizzo dello script Boost, tutto ciò che è necessario sapere è nella documentazione di CMake o direttamente nei file di script di ricerca.

2

Ti piace questa:

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

Si consiglia di non utilizzare add_dependencies quando si desidera collegare le librerie. Il collegamento implica una dipendenza, ma la dipendenza da sola non sarà sufficiente quando è necessario il collegamento.

2

Con Boost Hai davvero bisogno di usare il pacchetto 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}) 
Problemi correlati