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_LIBRARYDIR
a 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?
89
Boost_INCLUDE_DIR
a inne używają flagiBoost_INCLUDEDIR
( bez podkreślenia ). Możesz sprawdzić właściwy dla swojego przypadku, czytającFindBoost.cmake
plik, podpath-to-cmake/Modules/FindBoost.cmake
find_package(Boost CONFIG)
Odpowiedzi:
Czy na pewno robisz to we właściwy sposób? Chodzi o to, że zestawy CWprowadä
BOOST_INCLUDE_DIR
,BOOST_LIBRARYDIR
iBOOST_ROOT
automatycznie. Zrób coś takiego wCMakeLists.txt
:FIND_PACKAGE(Boost) IF (Boost_FOUND) INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR}) ADD_DEFINITIONS( "-DHAS_BOOST" ) ENDIF()
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:
SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/win32libs/boost") SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/win32libs/boost/lib")
Oczywiście, te dwie linie muszą być przed tym
FIND_PACKAGE(Boost)
INCMakeLists.txt
.źródło
${Boost_INCLUDE_DIR}
nie${BOOST_INCLUDE_DIR}
, sprawa się liczy.BOOST_INCLUDEDIR
'?Więcej pomocy można uzyskać, czytając
FindBoost.cmake
sam 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_ROOT
prawidłowo odbiera .FindBoost.cmake
czasami 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ącFindBoost.cmake
.Wreszcie w
FindBoost.cmake
przeszłości wystąpiły pewne błędy. Jedną z rzeczy, które możesz spróbować, jest pobranie nowszej wersji zFindBoost.cmake
najnowszej wersji CMake i umieszczenie jej w folderze projektu obokCMakeLists.txt
- wtedy nawet jeśli masz starą wersję boost, użyje nowej wersji,FindBoost.cmake
która jest w folder twojego projektu.Powodzenia.
źródło
Sam przez jakiś czas zmagałem się z tym problemem. Okazało się, że
cmake
szukał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życiuGCC 4.9.1
i ta wersja kompilatora faktycznie była obecna w naszym systemie; jednakGCC 4.4.7
zdarzyło się, że został zainstalowany. Tak się składa, żeFindBoost.cmake
skrypt cmake automatycznie wykrywałGCC 4.4.7
instalację zamiast tejGCC 4.9.1
i 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_COMPILER
na "-gcc49
" inCMakeLists.txt
. Dzięki tej zmianieFindBoost.cmake
wyszukałem i znalazłem moje pliki biblioteki Boost.źródło
Możesz także określić wersję Boost, której ma używać CMake, przekazując
-DBOOST_INCLUDEDIR
lub-DBOOST_ROOT
wskazując lokalizację poprawnych nagłówków BoostPrzykład:
cmake -DBOOST_ROOT=/opt/latestboost
Będzie to również przydatne, gdy w tym samym systemie znajduje się wiele wersji przyspieszenia.
źródło
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!
źródło
Miałem ten sam problem podczas próby uruchomienia
make
projektu po zainstalowaniu wersji Boost 1.66.0 na Ubuntu Trusty64. Komunikat o błędzie był podobny (nie do końca podobny) do tego:CMake Error at /usr/local/Cellar/cmake/3.3.2/share/cmake/Modules/FindBoost.cmake:1245 (message): Unable to find the requested Boost libraries. Boost version: 0.0.0 Boost include path: /usr/include Detected version of Boost is too old. Requested version was 1.36 (or newer). Call Stack (most recent call first): CMakeLists.txt:10 (FIND_PACKAGE)
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
cmake
same opcje i znalazłem następujące rzeczy:Uruchomiłem więc w spornym katalogu:
sudo cmake --check-system-vars
który zwrócił:
Also check system files when warning about unused and uninitialized variables. -- Boost version: 1.66.0 -- Found the following Boost libraries: -- system -- filesystem -- thread -- date_time -- chrono -- regex -- serialization -- program_options -- Found Git: /usr/bin/git -- Configuring done -- Generating done -- Build files have been written to: /home/user/myproject
i rozwiązał problem.
źródło
Aby
3.1.0-rc2
pobrać wersję cmake ,boost 1.57
określ-D_boost_TEST_VERSIONS=1.57
cmake version 3.1.0-rc2
domyślnieboost<=1.56.0
tak, 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++
źródło
Jeśli budujesz własne przyspieszenie, nie zapomnij skorzystać z opcji, w
--layout=versioned
przeciwnym razie wyszukiwanie określonej wersji biblioteki zakończy się niepowodzeniemźródło
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 naBoost_DEBUG
wyjściu jego wartości. Należy tutaj zaznaczyć pole wyboru „Zaawansowane” i włączyćCGAL_Boost_USE_STATIC_LIBS
.źródło
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
źródło
Miałem ten sam problem i żadne z powyższych rozwiązań nie działało. W rzeczywistości plik
include/boost/version.hpp
nie 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źć):
chmod o+wx ${BOOST_ROOT} -R # allow reading/execution on the whole library #chmod g+wx ${BOOST_ROOT} -R # this did not suffice, strangely, but it is another story I guess
źródło
Może się to również zdarzyć, jeśli
CMAKE_FIND_ROOT_PATH
jest ustawiona jako inna niżBOOST_ROOT
. Napotkałem ten sam problem, który pomimo ustawieniaBOOST_ROOT
otrzymywałem błąd. Ale do kompilacji krzyżowej dla ARM używałem Toolchain-android.cmake, w którym miałem (z jakiegoś powodu):set(BOOST_ROOT "/home/.../boost") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${SYSROOT}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${SYSROOT} -I${SYSROOT}/include/libcxx") set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}") set(CMAKE_FIND_ROOT_PATH "${SYSROOT}")
CMAKE_FIND_ROOT_PATH
wydaje się być nadrzędny,BOOST_ROOT
co powodowało problem.źródło
Może
pomoże Ci.
źródło