Android Studio: CMake无法找到Boost头文件

3
我在使用CMakeLists.txt将Boost Header文件包含到我的测试项目中。 我的some.cpp可以包含此头文件,没有出现任何错误,但我无法运行,因为该头文件显然依赖于其他Boost头文件,而且找不到所需的文件。 我的文件位于cpp文件夹中,而boost文件位于(C:\boost)的子目录中。
"RequiredHeader"中的包含文件,编译器正在查找:
..\src\main\cpp\boost\boost\AnotherHeader.hpp.
CMakeLists.txt (Boost部分)
# 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()

非常感谢您的帮助!

更新的问题:
如何告诉CMake我的Boost头文件在哪里,因为BOOST_ROOT设置后它仍然找不到正确的位置?

更新的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()

好的,所以实际问题是“找不到Boost”,而不是你在问题中提到的未能包含其头文件。我尝试设置这些目录,但没有成功。 - 展示你尝试了什么。并且不要用“RequiredHeader”替换实际的Boost头文件名。 - Tsyvarev
非常感谢您迄今为止的帮助。我意识到我的问题描述可能不够清晰,对此我深感抱歉。因此,我现在更新了我的问题描述、标题,并添加了新的CMake Boost部分。 - int ermedi_8
仔细阅读错误信息:它提到了 BOOST_INCLUDEDIR 变量,而不是 BOOST_INCLUDE_DIR。通过将 Boost_DEBUG 变量设置为 1(或任何非 false 值),您可以获取有关搜索 Boost 的其他信息。 - Tsyvarev
Boost_DEBUG 是一个很好的提示。我上传了上一次Gradle同步的输出结果 这里。虽然它并没有真正帮助我找到任何解决方案,但我希望能对你有所帮助 :) - int ermedi_8
Boost的包含目录应该是一个包含boost/config.hpp文件的目录(也就是说,包含目录应该有一个名为boost的子目录,而这个子目录中又应该包含名为config.hpp的文件)。请检查BOOST_INCLUDEDIR是否正好是那个目录。 - Tsyvarev
显示剩余4条评论
1个回答

2

这篇文章帮助我解决了这个问题。

包含Boost头文件和库:

set(BOOST_ROOT C:/boost)

包含include头文件"boost/*.hpp"和库"stage/lib"或任何其他您编译文件输出的路径。
然后您需要指定include头文件和libs路径。默认情况下,头文件存储在与根目录相同的目录中(因为"boost"文件夹会自动搜索),而库则存储在"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( <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()

然后我就能够简单地:
#include <boost/random.hpp>
#include <boost/whatever.hpp>

以下环境适用于我:

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

如果需要进一步解释,请在评论中提出您的疑虑!


通常情况下,您不需要使用target_include_directories,因为头文件将会被target_link_libraries自动包含。对于仅包含头文件的库,请使用target_link_directories(<your_lib> PUBLIC/PRIVATE Boost::boost) - Chris Watts
我无法使用你的代码行。AS无法识别“find_package”这个词。 - Slim_user71169
@Slim_user71169 我正在使用CMake 3.6和Android Studio 3.0,并且构建工作非常顺利。请尝试检查您的CMake版本(因为find_package与AS无关)。您能提供您收到的确切错误消息吗? - int ermedi_8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接