【问题标题】:Android build using CMake not able to locate external C++ library files使用 CMake 构建的 Android 无法找到外部 C++ 库文件
【发布时间】:2019-11-19 20:23:56
【问题描述】:

我正在尝试使用来自silverglint 的预编译提升。 由于某种原因,构建系统无法找到源文件 [这些文件存在于 src/main/cpp/boost/]

.../app/src/main/cpp/boost/thread.hpp:13:10: fatal error: 'boost/thread/thread.hpp' file not found

以下是我的CMakeLists.txt的相关内容:

add_library(boost SHARED IMPORTED)
set_property(TARGET boost PROPERTY IMPORTED_LOCATION
        ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/arm64-v8a/libboost_thread.so
        )

include_directories(
        src/main/cpp/boost/
        )

我怀疑这是由于路径配置错误造成的错误。感谢您提供解决此错误的任何帮助。

【问题讨论】:

    标签: android boost cmake


    【解决方案1】:

    如果文件包含在路径中:

    boost/thread/thread.hpp
    

    并且文件实际上位于此处:

    src/main/cpp/boost/thread/thread.hpp
    

    我认为包含的目录应该是:

    include_directories(
        src/main/cpp
    )
    

    如前所述,在 CMake 中包含目录时,最好使用 absolute 路径。此外,尽可能使用特定于目标的target_include_directories() 命令,以防止污染全局包含目录空间:

    target_include_directories(YourTarget PUBLIC 
        ${CMAKE_CURRENT_SOURCE_DIR}/src/main/cpp
    )
    

    FWIW,将 Boost 库导入项目的惯用方式在 this 答案中进行了描述,并且是一种更简洁的方法。

    【讨论】:

    • 我尝试了上述方法,但仍然遇到同样的错误。我能够过去使用 "thread/thread.hpp" 而不是 但是我必须在太多文件中更改路径这会导致其他问题!
    • 包含 boost 头文件的传统方式类似于 #include <boost/thread.hpp>,每个头文件都以 boost/ 目录为前缀,表明它确实是一个 Boost 包含文件,而不是您项目的本地文件.因此,通过 CMake 包含 src/main/cpp 目录是最好的方法。否则,是的,您将不得不更改所有 boost 头文件中的所有包含路径,这太疯狂了!
    • Android-Studio 还抱怨 有角度的包含,例如 。因此,在我的 cpp 源文件中,我必须使用 #include "boost/thread.hpp" 语句。
    • 我怀疑如果你改为使用include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/main/cpp),它会起作用。如果可行,那么您不妨将其更改为 target_include_directories(boost PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src/main/cpp)
    • @thomas_f 确实,我做了类似的事情,它奏效了。非常感谢!您能否在target_include_directories(.., PUBLIC, ..) 后面添加理性。我对此并不熟悉。
    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2016-11-02
    • 2014-08-07
    • 2021-12-25
    • 2017-11-25
    相关资源
    最近更新 更多