我使用CMakeLists.txt将Boost-Header文件包含到我的测试项目中。 我的some.cpp可以包含这个头没有任何错误,但我无法运行,因为头文件显然依赖于其他Boost头并且它没有找到所需的文件。 我的文件位于cpp文件夹中,boost文件位于(C: boost)子目录中:
.. SRC主 CPP提升 requiredHeader.hpp。
对于"RequiredHeader"中的包含文件,编译器正在查看:
.. SRC主 CPP提升提升 AnotherHeader.hpp。行使>
CMakeLists.txt(Boost-part)
# ADD BOOST
message("Import Boost...
")
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...
")
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(myDependantLib ${Boost_LIBRARIES})
endif()
非常感谢您的帮助!
更新的问题:
如何告诉CMake我的Boost头文件在哪里,因为它仍然找不到正确的位置,设置了BOOST_ROOT?
更新了CMakeLists.txt
# ADD BOOST
message("Add boost...
")
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...
")
target_link_libraries(calculator LINK_PUBLIC ${Boost_LIBRARIES})
endif()
当搜索头文件时,编译器只查找您为其指定的路径(例外是系统范围的头,但绝对不是你的情况)。所以,只是不要包含不需要的目录。顺便说一句,为什么你设置Boost_INCLUDE_DIRS,如果find_packge(Boost)应该为你设置它?
我注释掉了包含的目录但没有改变。我在find_package语句中添加了一个"REQUIRED",以获得一个"好的错误消息",如果在这里建议的话。它抛出的错误信息是:Unable to find the requested Boost libraries. Unable to find the Boost header files. Please set BOOST_ROOT to the root directory containing Boost or BOOST_INCLUDEDIR to the directory containing Boost's headers我尝试设置这些目录,但没有成功...
好吧,所以实际问题是"没有找到Boost",但不是没有像你在问题中所说的那样包含它的标题。 I tried setting those directories, but wasn't successful. - 显示您尝试过的内容。并且不要用"RequiredHeader"替换实际的Boost标头名称。
到目前为止,感谢您的帮助。我不认为我不知道我尝试了什么,抱歉==>所以现在我更新了我的问题,标题并添加了新的CMake Boost部分
仔细阅读错误消息:它涉及BOOST_INCLUDEDIR变量,而不是BOOST_INCLUDE_DIR。通过将Boost_DEBUG变量设置为1(或任何非假值),您可以获得有关搜索Boost的其他信息。
Boost_DEBUG是一个很好的暗示。我在这里上传了我上一次gradle同步的输出。既然它没有真正帮助我找到任何解决方案,我希望你会:)
Boost include目录应该是一个包含boost/config.hpp文件的目录(也就是说,include目录应该有boost子目录,而子目录应该包含名为config.hpp的文件)。检查BOOST_INCLUDEDIR是否与该目录完全相同。
非常感谢Tsyvarev!虽然我现在以另一种方式解决了我的问题而不是现在使用find_package,但这是帮助我找到答案的提示
为什么我在find_package(..)行中出错。 Android工作室可能没有"find_package"这个词
这篇文章帮助我解决了这个问题。
包括Boost-Header文件和库:
set(BOOST_ROOT C:/boost)
包含标题"boost / * .hpp"和库"stage / lib"的路径或已输出编译文件的任何其他路径。
然后,您需要指定include头和libs路径。在默认情况下,标题存储在与根相同的目录中(因为自动搜索"boost"文件夹)和libs,如"stage / lib"中所述。否则它应该是输出目录的"include"和"lib",而boost版本必须对应于"boost"文件夹中version.hpp中指定的版本:
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( 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( ${Boost_LIBRARIES} )
endif()
然后我能够简单地说:
#include
#include
这适用于以下环境:
Android Studio 2.3.1和3.0
NDK 14.1
提升1.56.0和1.64.0
Windows 10
如果需要进一步说明,请评论您的疑虑!
通常,您不需要target_include_directories,因为target_link_libraries会自动包含标题。 对于仅标头库,请使用target_link_directories( PUBLIC/PRIVATE Boost::boost)
我不能用你的台词。 AS无法识别"find_package"这个词
@ Slim_user71169我正在使用带有Android Studio 3.0的CMake 3.6,并且构建运行完美。 尝试检查你的CMake版本(因为find_package与AS无关)。 你能提供准确的错误信息吗?