2012-12-29 12 views
40

Mam mały projekt z plikiem Makefile, który próbuję przekonwertować na CMake, głównie po to, aby uzyskać doświadczenie z CMake. Dla celów tego przykładu projekt zawiera plik źródłowy (C++, chociaż nie sądzę, że jest to szczególnie istotny język) i statyczny plik biblioteki, który skopiowałem z innego miejsca. Załóżmy, ze względu na argument, że kod źródłowy do biblioteki jest niedostępny; Mam tylko plik .a i odpowiedni nagłówek.Jak powiedzieć CMake, aby połączyć w statycznej bibliotece w katalogu źródłowym?

My handmade Makefile zawiera ten build zasadę:

main: main.o libbingitup.a 
    g++ -o main main.o libbingitup.a 

które działa prawidłowo. Jak mogę powiedzieć CMake, aby to powtórzył? Nie dosłownie to dokładnie makefile, oczywiście, ale coś, co zawiera równoważne polecenie łączenia. Próbowałem oczywiste ale naiwnych sposoby, jak

add_executable(main main.cpp libbingitup.a) 

lub

add_executable(main main.cpp) 
target_link_libraries(main libbingitup.a) 

jak również różnych rzeczy z link_directories(.) lub add_library(bingitup STATIC IMPORTED) itd, ale nic tak daleko, że wyniki w udanym wiązaniem. Co powinienem robić?


szczegóły Version: CWprowadä 2.8.7 na Linux (Kubuntu 12.04) z GCC 4.6.3

Odpowiedz

60

CUpewnij sprzyja przechodzącej pełną ścieżkę do łączenia bibliotek, więc zakładając libbingitup.a jest w ${CMAKE_SOURCE_DIR}, wykonując następujące powinny odnieść sukces:

add_executable(main main.cpp) 
target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a) 
+1

wielki, który działa, dzięki! Wydaje się trochę hackish, aby wyraźnie umieścić tutaj pełną ścieżkę, ale myślę, że to tylko sposób CMake ... –

+2

Zgadzam się, że wydaje się to przesadą tutaj, ale jawnie określając pełną ścieżkę wypłaca dywidendy, jeśli masz wiele różnych wersji tej samej zainstalowanej biblioteki. – Fraser

+0

Niesamowite, jak zwykle! W moim przypadku rozwiązano problem bibliotek w zależności od innej zbudowanej biblioteki dynamicznej, która zależała od biblioteki statycznej: biblioteki zależne również próbowały połączyć się z tą biblioteką statyczną. – Antonio

10

znalazłem to pomocne ...

http://www.cmake.org/pipermail/cmake/2011-June/045222.html

Z ich przykładu:

ADD_LIBRARY(boost_unit_test_framework STATIC IMPORTED) 
SET_TARGET_PROPERTIES(boost_unit_test_framework PROPERTIES IMPORTED_LOCATION /usr/lib/libboost_unit_test_framework.a) 
TARGET_LINK_LIBRARIES(mytarget A boost_unit_test_framework C) 
+0

działa idealnie. dzięki –

7

Jeśli nie chcą zawierać pełną ścieżkę, można zrobić

add_executable(main main.cpp) 
target_link_libraries(main bingitup) 

bingitup jest taka sama nazwa, którą dać cel jeśli tworzysz statyczne biblioteki w projekcie CMake:

add_library(bingitup STATIC bingitup.cpp) 

CUpewnij automatycznie dodaje lib i .a na początku w systemie Linux i .lib na końcu w systemie Windows.

Jeśli biblioteka jest zewnętrzny, może chcesz dodać ścieżkę do biblioteki przy użyciu

link_directories(/path/to/libraries/) 
Powiązane problemy