【问题标题】:CMake doesn't find Boost libraries while using android-cmake toolchain fileCMake 在使用 android-cmake 工具链文件时找不到 Boost 库
【发布时间】:2013-09-13 23:20:47
【问题描述】:

我正在尝试为使用 Boost 库的代码创建一个 CMake 项目。我想为 Android 构建它,我使用这个项目作为参考:https://code.google.com/p/android-cmake/

我想使用我之前为 android 构建的 Boost 静态库,而不是将它们作为要编译的项目的一部分。

这是我使用 Boost 的项目部分的 CMakeLists.txt

#BOOST

set(BOOST_ROOT /home/neb/workspace/SDLActivityCMAKE/jni/boost)

set(Boost_INCLUDE_DIR /home/neb/workspace/SDLActivityCMAKE/jni/boost/include/boost-1_53)
set(BOOST_INCLUDEDIR /home/neb/workspace/SDLActivityCMAKE/jni/boost/include/boost-1_53)
set(Boost_LIBRARY_DIR /home/neb/workspace/SDLActivityCMAKE/jni/boost/lib)
set(BOOST_LIBRARYDIR /home/neb/workspace/SDLActivityCMAKE/jni/boost/lib)

set(Boost_USE_STATIC_LIBS ON)
set(USE_STATIC_BOOST ON)
set(Boost_USE_STATIC_RUNTIME ON)
set(BOOST_COMPILER gcc)

find_package(Boost COMPONENTS "thread-gcc-mt-1_53" "date_time-gcc-mt-1_53" REQUIRED)

include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIR})
#BOOSTEND

add_executable(main main.cpp)
target_link_libraries( main ${Boost_LIBRARIES} )

当我运行常规的cmake 命令(来自android 项目中jni 文件夹的子目录的cmake ..)没有问题时,cmake 会找到库。当我让 cmake 使用上述项目提供的 android.toolchain.cmake 时,我得到了这个(我正在使用 -DBoost_DEBUG 选项)。

-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:566 ] _boost_TEST_VERSIONS = 1.56.0;1.56;1.55.0;1.55;1.54.0;1.54;1.53.0;1.53;1.52.0;1.52;1.51.0;1.51;1.50.0;1.50;1.49.0;1.49;1.48.0;1.48;1.47.0;1.47;1.46.1;1.46.0;1.46;1.45.0;1.45;1.44.0;1.44;1.43.0;1.43;1.42.0;1.42;1.41.0;1.41;1.40.0;1.40;1.39.0;1.39;1.38.0;1.38;1.37.0;1.37;1.36.1;1.36.0;1.36;1.35.1;1.35.0;1.35;1.34.1;1.34.0;1.34;1.33.1;1.33.0;1.33
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:568 ] Boost_USE_MULTITHREADED = TRUE
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:570 ] Boost_USE_STATIC_LIBS = ON
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:572 ] Boost_USE_STATIC_RUNTIME = ON
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:574 ] Boost_ADDITIONAL_VERSIONS = 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:576 ] Boost_NO_SYSTEM_PATHS = 
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:644 ] Declared as CMake or Environmental Variables:
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:646 ]   BOOST_ROOT = /home/neb/workspace/SDLActivityCMAKE/jni/boost
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:648 ]   BOOST_INCLUDEDIR = /home/neb/workspace/SDLActivityCMAKE/jni/boost/include/boost-1_53
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:650 ]   BOOST_LIBRARYDIR = /home/neb/workspace/SDLActivityCMAKE/jni/boost/lib
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:652 ] _boost_TEST_VERSIONS = 1.56.0;1.56;1.55.0;1.55;1.54.0;1.54;1.53.0;1.53;1.52.0;1.52;1.51.0;1.51;1.50.0;1.50;1.49.0;1.49;1.48.0;1.48;1.47.0;1.47;1.46.1;1.46.0;1.46;1.45.0;1.45;1.44.0;1.44;1.43.0;1.43;1.42.0;1.42;1.41.0;1.41;1.40.0;1.40;1.39.0;1.39;1.38.0;1.38;1.37.0;1.37;1.36.1;1.36.0;1.36;1.35.1;1.35.0;1.35;1.34.1;1.34.0;1.34;1.33.1;1.33.0;1.33
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:734 ] location of version.hpp: /home/neb/workspace/SDLActivityCMAKE/jni/boost/include/boost-1_53/boost/version.hpp
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:754 ] version.hpp reveals boost 1.53.0
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:786 ] guessed _boost_COMPILER = -gcc46
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:796 ] _boost_MULTITHREADED = -mt
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:839 ] _boost_RELEASE_ABI_TAG = -s
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:841 ] _boost_DEBUG_ABI_TAG = -sd
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:884 ] _boost_LIBRARY_SEARCH_DIRS = /home/neb/workspace/SDLActivityCMAKE/jni/boost/lib;/home/neb/workspace/SDLActivityCMAKE/jni/boost/lib;/home/neb/workspace/SDLActivityCMAKE/jni/boost/stage/lib;/home/neb/workspace/SDLActivityCMAKE/jni/boost/include/boost-1_53/lib;/home/neb/workspace/SDLActivityCMAKE/jni/boost/include/boost-1_53/../lib;/home/neb/workspace/SDLActivityCMAKE/jni/boost/include/boost-1_53/stage/lib;C:/boost/lib;C:/boost;/boost/boost_1_53_0/lib;/boost/boost_1_53/lib;/boost/lib;/boost;/sw/local/lib
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:962 ] Searching for THREAD-GCC-MT-1_53_LIBRARY_RELEASE: boost_thread-gcc-mt-1_53-gcc46-mt-s-1_53;boost_thread-gcc-mt-1_53-gcc46-mt-s;boost_thread-gcc-mt-1_53-mt-s-1_53;boost_thread-gcc-mt-1_53-mt-s;boost_thread-gcc-mt-1_53
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:994 ] Searching for THREAD-GCC-MT-1_53_LIBRARY_DEBUG: boost_thread-gcc-mt-1_53-gcc46-mt-sd-1_53;boost_thread-gcc-mt-1_53-gcc46-mt-sd;boost_thread-gcc-mt-1_53-mt-sd-1_53;boost_thread-gcc-mt-1_53-mt-sd;boost_thread-gcc-mt-1_53-mt;boost_thread-gcc-mt-1_53
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:962 ] Searching for DATE_TIME-GCC-MT-1_53_LIBRARY_RELEASE: boost_date_time-gcc-mt-1_53-gcc46-mt-s-1_53;boost_date_time-gcc-mt-1_53-gcc46-mt-s;boost_date_time-gcc-mt-1_53-mt-s-1_53;boost_date_time-gcc-mt-1_53-mt-s;boost_date_time-gcc-mt-1_53
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:994 ] Searching for DATE_TIME-GCC-MT-1_53_LIBRARY_DEBUG: boost_date_time-gcc-mt-1_53-gcc46-mt-sd-1_53;boost_date_time-gcc-mt-1_53-gcc46-mt-sd;boost_date_time-gcc-mt-1_53-mt-sd-1_53;boost_date_time-gcc-mt-1_53-mt-sd;boost_date_time-gcc-mt-1_53-mt;boost_date_time-gcc-mt-1_53
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:1108 ] Boost_FOUND = FALSE
CMake Error at /usr/share/cmake-2.8/Modules/FindBoost.cmake:1195 (message):
  Unable to find the requested Boost libraries.

  Boost version: 1.53.0

  Boost include path:
  /home/neb/workspace/SDLActivityCMAKE/jni/boost/include/boost-1_53

  The following Boost libraries could not be found:

          boost_thread-gcc-mt-1_53
          boost_date_time-gcc-mt-1_53

  No Boost libraries were found.  You may need to set BOOST_LIBRARYDIR to the
  directory containing Boost libraries or BOOST_ROOT to the location of
  Boost.
Call Stack (most recent call first):
  src/CMakeLists.txt:15 (find_package)


-- Configuring incomplete, errors occurred!

所以我看到 CMake 正在这个确切的目录中搜索库: /home/neb/workspace/SDLActivityCMAKE/jni/boost/lib 其中有编译好的静态库:

neb@neb-VirtualBox:~/workspace/SDLActivityCMAKE/jni/boost/lib$ ls -l
total 24440
-rwxrwxrwx 1 neb neb   557190 sie 27 12:36 libboost_date_time-gcc-mt-1_53.a
-rwxrwxrwx 1 neb neb  1348474 sie 27 12:36 libboost_filesystem-gcc-mt-1_53.a
-rwxrwxrwx 1 neb neb   827216 sie 27 12:36 libboost_iostreams-gcc-mt-1_53.a
-rwxrwxrwx 1 neb neb  6813972 sie 27 12:36 libboost_program_options-gcc-mt-1_53.a
-rwxrwxrwx 1 neb neb 12927086 sie 27 12:37 libboost_regex-gcc-mt-1_53.a
-rwxrwxrwx 1 neb neb  1197696 sie 27 12:37 libboost_signals-gcc-mt-1_53.a
-rwxrwxrwx 1 neb neb   159462 sie 27 12:36 libboost_system-gcc-mt-1_53.a
-rwxrwxrwx 1 neb neb  1177994 sie 27 12:37 libboost_thread-gcc-mt-1_53.a`

我设置了指向我能找到的 BOOST 目录的所有变量,我设置了变量说 Boost 库应该是静态的,但它仍然找不到它们。我还能做什么?

【问题讨论】:

    标签: c++ boost android-ndk cmake toolchain


    【解决方案1】:

    使用 CMake 寻找 Boost

    首先让我说让 CMake 找到 Boost 可能很困难,因为 FindBoost.cmake 中的自动魔法会咬你一口,而 CMake 的制造商 KitWare 拥有我所遇到的任何流行项目中最糟糕的文档。如果它失败了,你必须遍历FindBoost.cmake 的源来调试它。

    交叉编译的Boost

    假设 1.62.0,你安装的交叉编译 boost 的目录如下所示

    boost-arm-build/include
    boost-arm-build/include/boost-1_62
    boost-arm-build/lib
    

    从 Project-Build 目录调用 CMake

    cmake \
       -DBoost_NO_SYSTEM_PATHS=TRUE \
       -DBoost_ADDITIONAL_VERSIONS="1.62" \
       -DCMAKE_TOOLCHAIN_FILE=../android.toolchain \
       -DBOOST_ROOT="../boost-arm-build" \
       ../Project/
    

    -DBoost_ADDITIONAL_VERSIONS - CMake 使用硬编码的字符串列表查找 Boost,如果您的 CMake 比您正在构建的 Boost 版本旧,它将不知道在包含目录中查找的位置,因此您需要通过它沿着。虽然版本实际上是 1.62.0,但 boost 将包含在 boost-1_62 中,所以我改用 1.62。在FindBoost.cmake 中,您会发现每个版本都添加了两次,因为这个原因,在“1.62.0”“1.62”中。

    您还应该检查您构建的库的文件名,例如,让我们看看system

    libboost_system-gcc-mt-1_62.a
    libboost_system-gcc-mt-1_62.so    # Symbolic link to libboost_system-gcc-mt-1_62.so.1.62.0
    libboost_system-gcc-mt-1_62.so.1.62.0
    libboost_system-gcc-mt-d-1_62.a
    libboost_system-gcc-mt-d-1_62.so  # Symbolic link to libboost_system-gcc-mt-d-1_62.so.1.62.0
    libboost_system-gcc-mt-d-1_62.so.1.62.0
    
    • gcc - 使用的编译器
    • mt - 多线程
    • d - 调试
    • 1_62 - 显然是 boost 的版本

    如果您看到的是 libboost_system.a,则表示您未能使用 --with-layout=versioned 构建 boost,应该查看我的 SO Answer on building boost using the NDK。如果您看到 clang 而不是 gcc ,那么您已经使用 clang 构建了 boost,但您可能需要使用 Boost_COMPILER 标志通知 CMake 存在 clang。

    -DBoost_COMPILER="-clang"
    

    android.toolchain 文件

    set(CMAKE_SYSTEM_NAME Android)
    
    set(CROSS_COMPILER_DIR /opt/ndk-R13-standalone)
    set(CMAKE_C_COMPILER ${CROSS_COMPILER_DIR}/bin/arm-linux-androideabi-gcc)
    set(CMAKE_CXX_COMPILER ${CROSS_COMPILER_DIR}/bin/arm-linux-androideabi-g++)
    
    set(ANDROID_NATIVE_API_LEVEL android-19)
    set(ANDROID_ABI armeabi-v7a)
    set(ANDROID_STL gnustl_static)
    
    set(CMAKE_SYSROOT ${CROSS_COMPILER_DIR}/sysroot)
    set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
    
    # search for programs in the build host directories
    set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
    

    【讨论】:

    • 这对我在 3 年多和 4 份工作前提出的问题非常有帮助和详尽的回答:D。谢谢!
    • 我刚刚花了好几个小时为自己解决了这个问题,并想在某个地方记录它!
    • 这很棒,我希望将来有人从中受益。
    【解决方案2】:

    我遇到了同样的问题。使用find_host_package(Boost COMPONENTS ..) 而不是find_package(Boost COMPONENTS ..) 为我解决了这个问题。

    (在这里找到:http://code.google.com/p/android-cmake/issues/detail?id=16

    【讨论】:

      【解决方案3】:

      这里有几个问题。

      看起来您的 boost 库是在没有 runtime-link=static 的情况下构建的,即它们没有静态链接到 C++ 标准库。如果是,他们名字的后缀应该包含s(参见boost docs on library naming

      另一个问题是 CMake 的 FindBoost module 期望 COMPONENTS 参数的形式为“date_time”、“thread”,而不是您提供的全名。

      另一个更小的一点是您不需要设置Boost_INCLUDE_DIRBoost_LIBRARY_DIR;如果成功,这些将由 CMake 模块设置。设置它们应该不会导致任何问题,但这只是不必要的混乱。

      另外,对于BOOST_ROOTBOOST_INCLUDEDIRBOOST_LIBRARYDIR,这些通常会通过命令行使用-D 选项设置,或者设置为环境变量以避免硬编码路径特定于将你的机器放入 CMakeLists.txt。

      最后一点是您应该删除link_directories 调用。它自己的文档不鼓励使用它,并且不需要它,因为您已经在 target_link_libraries 调用中将完整路径传递给了 boost 库。

      所以,最终版本应该更像:

      #BOOST
      set(Boost_USE_STATIC_LIBS ON)
      set(USE_STATIC_BOOST ON)  # Not sure if you really need this later.  If not, delete.
      set(Boost_USE_STATIC_RUNTIME OFF)
      set(Boost_COMPILER -gcc)
      
      find_package(Boost COMPONENTS thread date_time REQUIRED)
      
      include_directories(${Boost_INCLUDE_DIRS})
      #BOOSTEND
      
      add_executable(main main.cpp)
      target_link_libraries(main ${Boost_LIBRARIES})
      

      你可以像这样调用 CMake:

      cmake . -DBOOST_ROOT=<path to root> -DBOOST_INCLUDEDIR=... -DBOOST_LIBRARYDIR=...
      

      【讨论】:

      • 是否有必要用runtime-link=static来构建这些库?我使用相同的库用裸露的 ndk-build 编译了这段代码,它运行良好。另外,感谢您提供有关 -D 选项的信息,我计划在启动并运行所有其他文件时使用它。
      • 另外,我尝试了您的建议,但没有帮助。它坚持猜测的_boost_COMPILER var,设置为-gcc46。这是正确的吗?在cmake文件中有set(BOOST_COMPILER gcc),不应该是gcc吗?
      • 啊 - 让我更新我的答案。它应该是Boost_COMPILER 而不是BOOST_COMPILER。对不起!
      • 仍然没有运气,虽然我认为应该是 set(Boost_COMPILER -gcc) 而不是 set(Boost_COMPILER gcc)
      • 是的,你对“-gcc”的看法是正确的——现在更新了,谢谢。你能粘贴更新的调试输出吗?
      【解决方案4】:

      我遇到了同样的问题。我使用此存储库 Boost for android 构建了 boost,但我只有静态库。

      我不认为你真的需要使用 cmake 的 find_package。这就是我在 CMakeList.txt 中简单使用它的方式

      add_library(boost_system-gcc-mt-1_55  STATIC IMPORTED  GLOBAL)
      set_target_properties( # Specifies the target library.
                             boost_system-gcc-mt-1_55
      
                             # Specifies the parameter you want to define.
                             PROPERTIES IMPORTED_LOCATION
      
                             # Provides the path to the library you want to import.
                             ${CMAKE_SOURCE_DIR}/src/main/jni/boost/lib/libboost_system-gcc-mt-1_55.a )
      SET(Boost_LIBRARY_DIR ${Boost_LIBRARY_DIR} boost_system-gcc-mt-1_55)
      # You can make this include just once
      include_directories("src/main/jni/boost/include/boost-1_55")
      target_link_libraries(${MyNDKSampleLibs}
                         ${Boost_LIBRARY_DIR}
                         ${log-lib} 
      

      我在这里唯一可以提到的是不要忘记 set_target_properties 函数中的 cmake var ${CMAKE_SOURCE_DIR}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-27
        • 2014-06-02
        相关资源
        最近更新 更多