Cmake nie znajduje Boost

89

Próbuję skonfigurować projekt za pomocą CMake, ale nie można znaleźć bibliotek Boost, mimo że znajdują się one w określonym folderze. Mam określony Boost_INCLUDE_DIR, Boost_LIBRARYDIRa BOOST_ROOT, ale nadal pojawia się błąd mówiący, że CUpewnij nie jest w stanie znaleźć motywację. Jaka może być przyczyna takiego błędu?

Ivan Gromov
źródło
Niektóre wersje Boost używają flagi, Boost_INCLUDE_DIRa inne używają flagi Boost_INCLUDEDIR( bez podkreślenia ). Możesz sprawdzić właściwy dla swojego przypadku, czytając FindBoost.cmakeplik, podpath-to-cmake/Modules/FindBoost.cmake
marcelosalloum.
Do Twojej wiadomości, jeśli budujesz przyspieszenie dzięki wsparciu CMake, powinieneś użyćfind_package(Boost CONFIG)
Dmitry Sazonov

Odpowiedzi:

106

Czy na pewno robisz to we właściwy sposób? Chodzi o to, że zestawy CWprowadä BOOST_INCLUDE_DIR, BOOST_LIBRARYDIRi BOOST_ROOTautomatycznie. Zrób coś takiego w CMakeLists.txt:

Jeśli boost nie jest zainstalowany w domyślnej lokalizacji i dlatego nie może zostać znaleziony przez CMake, możesz wskazać CMake, gdzie ma szukać wzmocnienia w następujący sposób:

Oczywiście, te dwie linie muszą być przed tym FIND_PACKAGE(Boost)IN CMakeLists.txt.

fschmitt
źródło
36
To ${Boost_INCLUDE_DIR}nie ${BOOST_INCLUDE_DIR}, sprawa się liczy.
Ihor Kaharlichenko
3
Być może zmieniło się to w nowszych wersjach cmake, ale oto dokumenty referencyjne: cmake.org/cmake/help/v3.0/module/FindBoost.html
Nick Desaulniers
2
to nie działa dla mnie ... Znajduje bibliotekę boost, ale generuje mnóstwo błędów w czasie kompilacji
1
Czy nie powinno być ' BOOST_INCLUDEDIR'?
dmedine
2
@IhorKaharlichenko, ale BOOST_ROOT powinno mieć wartość BOOST_ROOT. wspaniale ! Spróbuję ze wszystkimi pokrowcami, wielbłądem, wszystkimi dekielkami, z podkreśleniami, bez podkreślników ... <face-palm>
Duck Dodgers
54

Więcej pomocy można uzyskać, czytając FindBoost.cmakesam plik. Znajduje się w katalogu „Moduły”.

Na dobry początek set(Boost_DEBUG 1)- to wypluje wiele informacji o tym, gdzie szuka boostu, czego szuka, i może pomóc wyjaśnić, dlaczego nie może go znaleźć.

Może również pomóc ci dowiedzieć się, czy BOOST_ROOTprawidłowo odbiera .

FindBoost.cmakeczasami ma również problemy, jeśli dokładna wersja wzmocnienia nie jest wymieniona w zmiennych Dostępne wersje. Możesz dowiedzieć się więcej na ten temat, czytając FindBoost.cmake.

Wreszcie w FindBoost.cmakeprzeszłości wystąpiły pewne błędy. Jedną z rzeczy, które możesz spróbować, jest pobranie nowszej wersji z FindBoost.cmakenajnowszej wersji CMake i umieszczenie jej w folderze projektu obok CMakeLists.txt- wtedy nawet jeśli masz starą wersję boost, użyje nowej wersji, FindBoost.cmakektóra jest w folder twojego projektu.

Powodzenia.

don jasne
źródło
10

Sam przez jakiś czas zmagałem się z tym problemem. Okazało się, że cmakeszukałem plików biblioteki Boost korzystając z konwencji nazewnictwa Boost, w której nazwa biblioteki jest funkcją wersji kompilatora użytej do jej zbudowania. Nasze biblioteki Boost zostały zbudowane przy użyciu GCC 4.9.1i ta wersja kompilatora faktycznie była obecna w naszym systemie; jednak GCC 4.4.7zdarzyło się, że został zainstalowany. Tak się składa, że FindBoost.cmakeskrypt cmake automatycznie wykrywał GCC 4.4.7instalację zamiast tej GCC 4.9.1i dlatego szukał plików biblioteki Boost z „ gcc44” w nazwie pliku zamiast „ gcc49”.

Prostą poprawką było zmuszenie cmake do założenia, że ​​GCC 4.9 jest obecny, poprzez ustawienie Boost_COMPILERna " -gcc49" in CMakeLists.txt. Dzięki tej zmianie FindBoost.cmakewyszukałem i znalazłem moje pliki biblioteki Boost.

Tom P.
źródło
7

Możesz także określić wersję Boost, której ma używać CMake, przekazując -DBOOST_INCLUDEDIRlub -DBOOST_ROOTwskazując lokalizację poprawnych nagłówków Boost

Przykład:

cmake -DBOOST_ROOT=/opt/latestboost

Będzie to również przydatne, gdy w tym samym systemie znajduje się wiele wersji przyspieszenia.

Skillachie
źródło
Dzięki, to zadziałało dla mnie z kompilacją Avro dla Windows.
ggurov
Pracowałem dla mnie, ustawiając go w narzędziu CMake GUI jako środowisko ... Następnie dodaj wpis, następnie BOOST_ROOT, wartość C: \ Program Files \ PCL 1.11.1 \ 3rdParty \ Boost (mam zainstalowany PCL)
Richard Keene
5

Miałem też podobny problem i odkryłem, że zmienne env BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR i BOOST_ROOT muszą zawierać ścieżki bezwzględne . HTH!

sphakka
źródło
Tak. Miałem ten sam problem z powodu względnej ścieżki w pliku env BOOST_ROOT. Wielkie dzięki!
korst1k
2

Miałem ten sam problem podczas próby uruchomienia makeprojektu po zainstalowaniu wersji Boost 1.66.0 na Ubuntu Trusty64. Komunikat o błędzie był podobny (nie do końca podobny) do tego:

Boost był zdecydowanie zainstalowany, ale CMake nie mógł go wykryć. Po spędzeniu mnóstwa czasu na majstrowaniu przy ścieżkach i zmiennych środowiskowych, w końcu sprawdziłem cmakesame opcje i znalazłem następujące rzeczy:

Uruchomiłem więc w spornym katalogu:

sudo cmake --check-system-vars

który zwrócił:

i rozwiązał problem.

user3006381
źródło
2

Aby 3.1.0-rc2pobrać wersję cmake , boost 1.57określ-D_boost_TEST_VERSIONS=1.57

cmake version 3.1.0-rc2domyślnie boost<=1.56.0tak, jak widać przy użyciu-DBoost_DEBUG=ON

cmake -D_boost_TEST_VERSIONS=1.57 -DBoost_DEBUG=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++

Simon Allfrey
źródło
2

Jeśli budujesz własne przyspieszenie, nie zapomnij skorzystać z opcji, w --layout=versionedprzeciwnym razie wyszukiwanie określonej wersji biblioteki zakończy się niepowodzeniem

Gaetano Mendola
źródło
1

Jeszcze jedna rada dla każdego, kto próbuje zbudować CGAL, w szczególności ze statycznie połączonym Boostem . Nie wystarczy zdefiniować Boost_USE_STATIC_LIBS; zostaje nadpisany przez czas na Boost_DEBUGwyjściu jego wartości. Należy tutaj zaznaczyć pole wyboru „Zaawansowane” i włączyć CGAL_Boost_USE_STATIC_LIBS.

Philip
źródło
1

Dla mnie ten błąd był po prostu dlatego, że Boost nie był zainstalowany, więc na Ubuntu:

sudo apt install build-essential libboost-system-dev libboost-thread-dev libboost-program-options-dev libboost-test-dev

bbs
źródło
0

Miałem ten sam problem i żadne z powyższych rozwiązań nie działało. W rzeczywistości plik include/boost/version.hppnie mógł zostać odczytany (przez skrypt cmake uruchomiony przez jenkinsa).

Musiałem ręcznie zmienić uprawnienia biblioteki (boost) (mimo że jenkins należy do grupy, ale to kolejny problem związany z jenkinsem, którego nie mogłem rozgryźć):

PJ127
źródło
0

Może się to również zdarzyć, jeśli CMAKE_FIND_ROOT_PATHjest ustawiona jako inna niż BOOST_ROOT. Napotkałem ten sam problem, który pomimo ustawienia BOOST_ROOTotrzymywałem błąd. Ale do kompilacji krzyżowej dla ARM używałem Toolchain-android.cmake, w którym miałem (z jakiegoś powodu):

CMAKE_FIND_ROOT_PATHwydaje się być nadrzędny, BOOST_ROOTco powodowało problem.

Sabin
źródło
-1

Może

pomoże Ci.

yayu
źródło