使用android-cmake工具链文件时,CMake没有找到Boost库

Neb*_*ril 10 c++ boost cmake toolchain android-ndk

我正在尝试为使用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} )
Run Code Online (Sandbox Code Playgroud)

当我运行常规cmake命令(cmake ..从android项目中的jni文件夹的子目录)没有问题,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!
Run Code Online (Sandbox Code Playgroud)

所以我看到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`
Run Code Online (Sandbox Code Playgroud)

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

Cam*_*mer 6

使用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
Run Code Online (Sandbox Code Playgroud)

从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/
Run Code Online (Sandbox Code Playgroud)

-DBoost_ADDITIONAL_VERSIONS-CMake使用硬编码的字符串列表查找Boost,如果您的CMake低于您所构建的Boost版本,它将不知道在include目录中查找的位置,因此您需要将其传递。尽管该版本实际上是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
Run Code Online (Sandbox Code Playgroud)
  • gcc -使用的编译器
  • mt -多线程
  • d -调试
  • 1_62 -很明显,boost的版本

如果您看到libboost_system.a,则意味着您无法使用构建增强功能,--with-layout=versioned并且可能应该查看有关使用NDK构建增强功能的SO Answer。如果您看到的clang不是gcc很好,则使用clang构建了boost,但是您可能需要使用Boost_COMPILER标志告知CMake clang存在。

-DBoost_COMPILER="-clang"
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚花了最后几个小时为自己解决此问题,并想在某个地方进行记录! (2认同)