2011-11-10 4 views
14

Próbuję użyć skoku cmake do skompilowania aplikacji opartej na doładowaniu w systemie Windows. Biblioteki header tylko działa dobrze, ale cmakes nie znajdzie biblioteki (Następujące biblioteki Boost nie można znaleźć: boost_serialization) Odpowiedni fragment skryptu cmake jest:cmake nie znajduje podkomendnych bibliotek

#path where cmake can find additional libraries 
SET(CMAKE_PREFIX_PATH Libs) 

#boost 
SET(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0") 
SET(Boost_USE_STATIC_LIBS ON) 
find_package(Boost REQUIRED COMPONENTS serialization) 

mam folder o nazwie " Libs "wewnątrz mojego projektu, w którym przechowywane są biblioteki stron trzecich, takie jak DevIL i boost, więc ustawiłem to jako pierwsze. Działa dobrze dla Diabła i zwiększa ilość plików tylko nagłówkowych, więc przypuszczam, że nie powinienem potrzebować zmiennej BOOST_ROOT. Instalacja doładowania jest standardową dystrybucją źródeł z boost.org, którą skompilowałem z bjam. Biblioteki są przechowywane w boost_1_47_0 \ bin.v2 \ libs, nie zmieniłem niczego w procesie kompilacji. Myślę, że to trochę dziwne, że folder boost_1_47_0 \ libs nie zawiera żadnych plików bibliotecznych, ale plików bjam i innych rzeczy, ale to nie powinno stanowić problemu, ponieważ ten szew jest normalnym sposobem na zwiększenie poboru w systemie Windows ze źródła.

Spojrzałem na wynik debugowania z FindBoost.cmake (używam domyślnego skryptu z CMake 2.8) i nie szuka go w bin.v2. Zamiast tego wyszukuje boost_ROOT/lib, ale kiedy skopiowałem zawartość z bin.v2 \ libs do lib nadal nie znajduje nic.

Co to jest elegancki sposób na znalezienie bodźca, który będzie również działał na innych platformach ze wspólnymi dystrybucjami bosst?

Odpowiedz

5

Cóż, rozwiązałem problem, ale nie jestem w pełni zadowolony z mojego rozwiązania. Moim zdaniem problem polegał na tym, że bjam tworzy skomplikowaną strukturę folderów. Teraz właśnie skopiowałem pliki biblioteki z "boost_1_47_0 \ bin.v2 \ libs \ serialization \ build \ msvc-9.0 \ debug \ link-static \ threading-multi" do "boost_1_47_0 \ lib". Muszę to zrobić ręcznie, ale nie korzystam z tak wielu bibliotek doładowania, więc ten krok jest moim zdaniem w porządku. Będę dokumentować moje rozwiązanie poza skryptem cmake, więc inni użytkownicy powinni się z tym zgodzić.

+5

Przeczytaj instrukcję, poznaj etap i zainstaluj. – mloskot

+0

Przeczytałem instrukcję (http://www.boost.org/doc/libs/1_48_0/more/getting_started/windows.html), ale skorzystałem z opcji 5.2. Znalazłem katalog stage ze wszystkimi bibliotekami w nim i mogę teraz ustawić to jako katalog biblioteki boost, ale następnym razem wypróbuję opcję 5.3. – JonathanK

+0

Możesz także po prostu skopiować katalog stage i boost (headers), aby stworzyć własną instalację Boost. na przykład boost/-> C: \ boost \ include \ boost i stage/* -> C: \ boost \ lib – mloskot

13

Chciałbym spróbować ustawić BOOST_ROOT w twoim CMakeLists.txt. Wiem, że CMake 2.8.6 znajdzie boost 1.47.0, gdy ustawisz zmienną Boost_ADDITIONAL_VERSIONS, ponieważ działa ona dla mnie w oknach, gdy mam ustawiony BOOST_ROOT.

Oto co mam na 1 projekt:

 

    set(BOOST_COMPONENTS_NEEDED serialization) 

    # The following verifyies that BOOST_ROOT is set properly. 
    if(NOT BOOST_ROOT AND NOT $ENV{BOOST_ROOT} STREQUAL "") 
     FILE(TO_CMAKE_PATH $ENV{BOOST_ROOT} BOOST_ROOT) 
     if(NOT EXISTS ${BOOST_ROOT}) 
      MESSAGE(STATUS ${BOOST_ROOT} " does not exist. Checking if BOOST_ROOT was a quoted string..") 
      STRING(REPLACE "\"" "" BOOST_ROOT ${BOOST_ROOT}) 
      if(EXISTS ${BOOST_ROOT}) 
       MESSAGE(STATUS "After removing the quotes " ${BOOST_ROOT} " was now found by CMake") 
      endif(EXISTS ${BOOST_ROOT}) 
     endif(NOT EXISTS ${BOOST_ROOT}) 

    # Save the BOOST_ROOT in the cache 
     if(NOT EXISTS ${BOOST_ROOT}) 
      MESSAGE(WARNING ${BOOST_ROOT} " does not exist.") 
     else(NOT EXISTS ${BOOST_ROOT}) 
      SET (BOOST_ROOT ${BOOST_ROOT} CACHE STRING "Set the value of BOOST_ROOT to point to the root folder of your boost install." FORCE) 
      #SET (BOOST_INCLUDEDIR ${BOOST_ROOT}/Include) 
      #SET (BOOST_LIBRARYDIR ${BOOST_ROOT}/lib) 
     endif(NOT EXISTS ${BOOST_ROOT}) 

    endif(NOT BOOST_ROOT AND NOT $ENV{BOOST_ROOT} STREQUAL "") 

    if(WIN32 AND NOT BOOST_ROOT) 
     MESSAGE(WARNING "Please set the BOOST_ROOT environment variable.") 
    endif(WIN32 AND NOT BOOST_ROOT) 

    set(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0") 
    set(Boost_DEBUG ON) 
    set(Boost_USE_STATIC_LIBS  OFF) 
    set(Boost_USE_MULTITHREADED  ON) 
    set(Boost_USE_STATIC_RUNTIME OFF) 
    FIND_PACKAGE(Boost 1.47.0 COMPONENTS ${BOOST_COMPONENTS_NEEDED}) 
    if(Boost_FOUND) 
     MESSAGE(STATUS "Setting up boost.") 
     include_directories(${Boost_INCLUDE_DIRS}) 
     if(Boost_DEBUG) 
      MESSAGE(STATUS "BOOST Libraries " ${Boost_LIBRARIES}) 
      FOREACH(BOOST_COMPONENT ${BOOST_COMPONENTS_NEEDED}) 
       STRING(TOUPPER ${BOOST_COMPONENT} BOOST_COMPONENT_UPCASE) 
       MESSAGE(STATUS "Boost " ${BOOST_COMPONENT} ": " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY}) 
       MESSAGE(STATUS "Boost " ${BOOST_COMPONENT} " Debug: " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY_DEBUG}) 
       MESSAGE(STATUS "Boost " ${BOOST_COMPONENT} " Release: " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY_RELEASE}) 
      ENDFOREACH(BOOST_COMPONENT) 
     endif(Boost_DEBUG) 
    endif(Boost_FOUND) 

+1

To mi bardzo pomaga, dzięki za ten skrypt. Po linii Boost_FOUND podaję wiersz: LINK_DIRECTORIES ($ {Boost_LIBRARY_DIRS}), w przeciwnym razie ciągle mówi, że biblioteka nie została znaleziona. Mam nadzieję, że to pomoże innym mieć ten sam problem. – Cross

+0

- NIE MOŻNA znaleźć zwiększenia Wersja doładowania: 1.60.0 Ścieżka włączenia wzmocnienia:/usr/include Wykryta wersja wzmocnienia jest za stara. Wymagana wersja to 1.64 (lub nowsza). ..... Nawet przy dodawaniu tego, co jest wymienione w powyższym komentarzu (Windows 10/CLION) –

1

miałem problem z tym wcześniej. Z jakiegoś powodu b2 (aka bjam) utworzył biblioteki doładowania z wiodącą "biblioteką". Skrypt cmake nie będzie szukał pliku o nazwie libboost_thread.lib. Znajdzie on tylko boost_thread.lib. Usuń wiodące lib, a cmake powinien je znaleźć.

+0

Próbowałem, ale to nie pomogło. Teraz nazwa jest podobna do boost_serialization-vc90-mt-1_47.lib zamiast libboost_serialization -vc90-mt-1_47.lib - i jeśli chcę użyć więcej bibliotek, naprawdę nie chcę zmieniać ich wszystkich, aby cmake mógł je znaleźć. Moim zdaniem find_package powinno wykonać całą pracę dla mnie ... – JonathanK

+3

Nie zmieniaj nazwy bibliotek. Prefiks "lib" jest przeznaczony dla bibliotek statycznych, bez przedrostka dla bibliotek DLL. Powinieneś budować przy użyciu środowiska wykonawczego-link = shared. –

+0

@AndreasHaferburg W moim przypadku starałem się zwiększyć statyczne łącze do mojej aplikacji. –

0

Można dodać następujące opcje do linii poleceń cmake powiedzieć CGAL używać statycznych bibliotek Boost:

-DCGAL_Boost_USE_STATIC_LIBS=true 
0

Przyjechałem tu z podobnego problemu i po prostu chciałem powiedzieć, moja poprawka była podobna, ale nie dokładnie to samo. Mój prefiks instalacji to C: \ lib \ boost \ boost_1_57_0. Ustawiłem zmienną środowiskową BOOST_ROOT wskazującą na ten katalog, ale CMake (3.1.0) nadal nie mógł znaleźć nagłówków. Zdałem sobie sprawę, że nagłówki domyślnie instalują się w C: \ lib \ boost \ boost_1_57_0 \ include \ boost-1_57 \ boost. Nie zamierzam uruchomić kilka wersji, więc po prostu przeniósł się ostateczną katalogu doładowania w dół jeden i usuwa katalog doładowania 1_57 i skończył z nagłówkami tutaj:

C:\lib\boost\boost_1_57_0\include\boost 

I CUpewnij znaleźć wszystko.