2017-05-22 2 views
3

Ich habe eine Boost-Header-Datei zu meinem Testprojekt mit CMakeLists.txt hinzugefügt. Meine some.cpp kann diesen Header ohne Fehler enthalten, aber ich kann nicht ausführen, da die Header-Datei offensichtlich auf anderen Boost-Headern beruht und die erforderlichen Dateien nicht findet. Der Speicherort meiner Dateien befindet sich im cpp-Ordner und die Boost-Dateien befinden sich in (C: \ boost) einem Unterverzeichnis: Android Studio: CMake findet keine Boost-Header-Dateien

.. \ src \ main \ cpp \ boost \ RequiredHeader.hpp.

Für den Include-Dateien in der "RequiredHeader" Compiler betrachtet:

.. \ src \ main \ cpp \ boost \ boost \ AnotherHeader.hpp.

CMakeLists.txt (boost-Teil)

# ADD BOOST 
message("Import Boost...\n") 
set(Boost_USE_STATIC_LIBS OFF) 
set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 
set(Boost_INCLUDE_DIRS C:/boost_1_64_0/boost) 
find_package(Boost 1.64.0) 

if(Boost_FOUND) 
    message("Boost found! Link libraries...\n") 
    include_directories(${Boost_INCLUDE_DIRS}) 
    target_link_libraries(myDependantLib ${Boost_LIBRARIES}) 
endif() 

Ihre Hilfe wird sehr geschätzt!

Aktualisiert Frage:
Wie CMake sagen, wo meine Boost-Header-Dateien sind, da es immer noch nicht den richtigen Ort zu finden, mit BOOST_ROOT Set?

Aktualisiert CMakeLists.txt

# ADD BOOST 
message("Add boost...\n") 
set(Boost_USE_STATIC_LIBS OFF) 
set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 
set(BOOST_ROOT C:/boost_1_64_0) 
set(BOOST_INCLUDE_DIR C:/boost_1_64_0/boost) 

FIND_PACKAGE(Boost 1.64.0 COMPONENTS foreach REQUIRED) 

if(Boost_FOUND) 
    message("Boost found! Link libraries...\n") 
    target_link_libraries(calculator LINK_PUBLIC ${Boost_LIBRARIES}) 
endif() 
+0

Bei der Suche Header-Dateien, Compiler sieht nur diese Pfade **, die Sie ** für sie angeben (Ausnahme ist systemweite Header, aber es ist definitiv nicht Ihr Fall). Also, fügen Sie keine unnötigen Verzeichnisse ein. BTW, warum hast du * Boost_INCLUDE_DIRS * gesetzt, wenn 'find_packge (Boost)' es für dich einstellen sollte? – Tsyvarev

+0

Ich habe die enthaltenen Verzeichnisse auskommentiert, aber nichts geändert. Ich habe meiner find_package-Anweisung ein "REQUIRED" hinzugefügt, um eine "nette Fehlermeldung" zu erhalten, falls [hier] vorgeschlagen wird (https://stackoverflow.com/questions/1065011/why-is-is-this-boost-header-file) -nicht eingeschlossen? rq = 1). Die Fehlermeldung, die es mir wirft, ist: "Kann die angeforderten Boost-Bibliotheken nicht finden. Die Boost-Headerdateien konnten nicht gefunden werden. Bitte setze BOOST_ROOT auf das root-Verzeichnis, das Boost oder BOOST_INCLUDEDIR enthält, in das Verzeichnis, das Boosts Header enthält. Ich habe versucht, diese Verzeichnisse zu setzen, war aber nicht erfolgreich ... –

+0

Nun, so ** das eigentliche Problem ist "Boost nicht finden" kein Fehler beim Einbinden seines Headers wie in der Frage angegeben. 'Ich habe versucht, diese Verzeichnisse zu setzen, war aber nicht erfolgreich. - Zeigen Sie, was Sie versucht haben. Ersetzen Sie den Namen des tatsächlichen Boost-Headers nicht durch "RequiredHeader". – Tsyvarev

Antwort

1

Dieser Beitrag here half mir dies bei der Lösung.

Fügen-Boost-Header-Dateien und Bibliotheken: "boost/* HPP"

set(BOOST_ROOT C:/boost) 

Der Weg, die Folgendes enthalten Header und Bibliotheken "Bühne/lib" oder jeder anderen Pfad, in dem kompilierten Dateien wurde ausgegeben.
Dann müssen Sie die Include-Header und libs Pfade angeben. Im Standardfall werden die Header im gleichen Verzeichnis wie der root (da der "boost" Ordner automatisch durchsucht wird) und die libs wie in "stage/lib" beschrieben gespeichert. Ansonsten sollte es „include“ und „lib“ Ihr Ausgabeverzeichnisses, während die Boost-Version des in version.hpp in den „Boost“ Ordner angegeben werden, entsprechend hat:

set(Boost_INCLUDE_DIR ${BOOST_ROOT}/include) 
set(Boost_LIBRARY_DIR ${BOOST_ROOT}/lib) 
set(Boost_Version 1_64) 

find_package(Boost ${Boost_Version} COMPONENTS system thread) 
if(Boost_FOUND) 
    target_include_directories(<your_lib> PUBLIC/PRIVATE ${Boost_INCLUDE_DIR}) 


    # its possible to include boost to system path too: 
    # include_directories(SYSTEM ${Boost_INCLUDE_DIR}) 

    link_directories(${Boost_LIBRARY_DIR}) 
    target_link_libraries(<your_lib> ${Boost_LIBRARIES}) 
endif() 

Dann konnte ich einfach:

#include <boost/random.hpp> 
#include <boost/whatever.hpp> 

Dieser arbeitete für mich auf folgende Umgebung:

  • Android Studio 2.3.1 und 3.0
  • NDK 14.1
  • -Boost 1.56.0 und 1.64.0
  • Windows-10

Wenn weitere Erklärung benötigt wird, bitte Kommentar Ihre Sorgen!

+0

Normalerweise sollten Sie 'target_include_directories' nicht benötigen, da die Header automatisch von' target_link_libraries' eingeschlossen werden. Verwenden Sie für die Header-only-Bibliothek 'target_link_directories ( PUBLIC/PRIVATE Boost :: boost)' – CJxD

+0

Ich kann Ihre Zeilen nicht verwenden. AS kann das Wort "find_package" nicht erkennen –

+0

@ Slim_user71169 Ich verwende CMake 3.6 mit Android Studio 3.0 und der Build funktioniert einwandfrei. Versuchen Sie, Ihre CMake-Version zu überprüfen (da find_package nichts mit AS zu tun hat). Können Sie die genaue Fehlermeldung angeben, die Sie erhalten? –