2013-03-22 14 views
16

Vorrei utilizzare CMake per collegare il mio progetto alla mia libreria condivisa. La libreria è condivisa solo tra una manciata di progetti ed è piuttosto piccola, quindi mi piacerebbe davvero costruirla prima che sia collegata. Costruirlo ogni volta sembra un'idea migliore di dover mantenere una versione precompilata aggiornata, perché io decimo di cambiarla insieme al progetto. È separato, perché contiene cose di cui quasi certamente avrò bisogno nel prossimo progetto.Utilizzo di CMake per il collegamento statico a una libreria esterna al progetto

Come posso configurare CMake per farlo?

Il mio attuale CMakeLists.txt per il progetto in questione è simile al seguente:

find_package(Boost REQUIRED COMPONENTS unit_test_framework) 

include_directories(${BaumWelch_SOURCE_DIR}/../../grzesLib/src 
        ${BaumWelch_SOURCE_DIR}/src 
        ${Boost_INCLUDE_DIRS}) 

if(CMAKE_COMPILER_IS_GNUCXX) 
    add_definitions(-g -std=c++11 -Wall -Werror -Wextra -pedantic -Wuninitialized) 
endif() 


# Create the unit tests executable 
add_executable(
baumwelchtests stateindextest.cpp baumiterationtest.cpp baumwelchtest.cpp sampleparameters.cpp sdetest.cpp 
# Key includes for setting up Boost.Test 
testrunner.cpp 
# Just for handy reference 
exampletests.cpp 
) 

# Link the libraries 
target_link_libraries(baumwelchtests ${Boost_LIBRARIES} baumwelchlib grzeslib) 

ma ovviamente la compilazione fallisce con:

/usr/bin/ld: cannot find -lgrzeslib 
+0

Funziona se si aggiunge .a al libname? – drescherjm

+0

@drescherjm, questa libreria non è potenzialmente nemmeno compilata a quel punto, inoltre non specificherò dove dovrebbe essere il binario, quindi sono sicuro che l'aggiunta di .a alla libname non aiuterà. – Grzenio

risposta

26

Lei ha detto che desideri costruire la biblioteca piuttosto che utilizzare una versione precompilata. Se la libreria ha un CMakeList, dovresti aggiungerlo usando add_subdirectory(path/to/the/library/source/directory). Diventerà quindi un sottoprogetto del tuo progetto e potrai utilizzare normalmente i nomi dei suoi target nella tua CMakeList.

Si noti che mentre il comando è chiamato add_ sottodirectory, può essere una directory arbitraria su disco; non deve essere una sottodirectory della directory di origine del progetto principale. Nel caso in cui non sia una sottodirectory, devi specificare esplicitamente anche una directory binaria. Esempio:

add_subdirectory(/path/to/the/library/source/directory subproject/grzeslib) 

Il secondo argomento, se dato come un percorso relativo, viene interpretato relativamente CMAKE_CURRENT_BINARY_DIR.

+2

Ho provato, ma ottengo il seguente errore: 'add_subdirectory non ha una directory binaria ma la directory indicata fonte "/home/ga1009/PhD/cpp/grzesLib/src "non è una sottodirectory di "/home/ga1009/PhD/cpp/pmi/cpp". Quando si specifica una sorgente fuori dall'origine, una directory binaria deve essere specificata in modo esplicito. Cosa dovrei fare per questo? – Grzenio

+0

@Grzenio Ho aggiunto le informazioni alla risposta. – Angew

+0

Ottengo lo stesso errore di @Grzenio ... non mi permette di inserire alcuna directory arbitraria. –

Problemi correlati