2013-03-22 14 views
16

Chciałbym użyć CMake do powiązania mojego projektu z moją biblioteką współdzieloną. Biblioteka jest dzielona tylko pomiędzy kilkoma projektami i jest raczej mała, więc naprawdę chciałbym ją zbudować, zanim zostanie połączona. Budowanie go za każdym razem wydaje się lepszym pomysłem niż konieczność utrzymywania aktualnej, prekompilowanej wersji, ponieważ ja 10 zmieniam ją razem z projektem. Jest osobny, ponieważ zawiera rzeczy, których prawie na pewno będę potrzebował w następnym projekcie.Używanie CMake do statycznego linkowania do biblioteki poza projektem

Jak skonfigurować CMake, aby to zrobić?

Mój obecny CMakeLists.txt dla danego projektu wygląda następująco:

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) 

ale oczywiście kompilacja nie powiedzie się z:

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

Czy to działa, jeśli dodasz .a do nazwy libname? – drescherjm

+0

@drescherjm, biblioteka ta nie jest potencjalnie nawet skompilowana w tym miejscu, ponadto nie określam gdzie binarny byłby, więc jestem pewny, że dodanie .a do nazwy pliku nie pomoże. – Grzenio

Odpowiedz

26

Wspomniał pan chcesz zbudować bibliotekę zamiast użyj prekompilowanej wersji. Jeśli biblioteka ma CMakeList, powinieneś dodać ją przy użyciu add_subdirectory(path/to/the/library/source/directory). Następnie stanie się podprojektem twojego projektu i będziesz mógł normalnie używać nazw jego celów w swoim CMakeList.

Należy zauważyć, że chociaż polecenie jest nazywane add_ podkatalogiem, może to być dowolny katalog na dysku; nie musi to być podkatalog katalogu źródłowego projektu głównego. W przypadku, gdy nie jest to podkatalog, musisz jawnie określić także katalog binarny. Przykład:

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

Drugi argument, przy podawaniu w sposób stosunkowo drogi, jest interpretowany w odniesieniu do CMAKE_CURRENT_BINARY_DIR.

+2

Próbowałem, ale pojawia się następujący błąd: 'add_subdirectory nie podano binarnego katalogu, ale podane źródło katalogu "/home/ga1009/PhD/cpp/grzesLib/src "nie jest podkatalogiem "/home/ga1009/PhD/cpp/pmi/cpp ". Podczas określania źródła poza drzewem binarny katalog musi być jawnie określony. ". Co mam z tym zrobić? – Grzenio

+0

@Grzenio Dodałem informacje do odpowiedzi. – Angew

+0

Otrzymuję ten sam błąd @Grzenio ... nie pozwala mi umieścić dowolnego katalogu. –

Powiązane problemy