CMake не находит библиотеки Boost при использовании файла инструментария android-cmake

Я пытаюсь сделать проект CMake для кода, который использует библиотеки Boost. Я хочу построить его для Android, и я использую этот проект в качестве ссылки: https://code.google.com/p/android-cmake/.

Я хочу использовать статические библиотеки Boost, которые я ранее создал для Android, и не делать их частью проекта для компиляции.

Это мой CMakeLists.txt для части проекта, которая использует Boost

#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 команда (cmake .. из подкаталога папки jni в проекте android) проблем нет, 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 должны быть статическими, но он все равно не находит их. Что еще я могу сделать?

7

Решение

В поисках повышения с помощью CMake

Позвольте мне начать с того, что заставить CMake найти Boost может быть сложно, потому что FindBoost.cmake укусит вас, и у KitWare создатели CMake будут одни из худших документов из всех популярных проектов, с которыми я когда-либо сталкивался. Вам придется пройти через источник FindBoost.cmake отладить его, если не получится.

Кросс-скомпилированный Boost

Каталог, в котором вы установили кросс-скомпилированный буст, выглядит так, если принять 1.62.0

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

Звонок в CMake из каталога Project-Build

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, которую вы создаете, он не будет знать, где искать в каталоге include, поэтому вам нужно будет передать его. Хотя версия на самом деле 1.62.0, но в 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, это означает, что вы не смогли создать boost с --with-layout=versioned и, вероятно, следует проверить мой SO Ответ на наращивание потенциала с использованием NDK. Если ты видишь clang вместо gcc замечательно, что вы создали boost с помощью clang, но вам, вероятно, нужно сообщить CMake, что clang существует, используя флаг Boost_COMPILER.

-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)
4

Другие решения

У меня была та же проблема. С помощью find_host_package(Boost COMPONENTS ..) вместо find_package(Boost COMPONENTS ..) решил проблему для меня.

(Найдено здесь: http://code.google.com/p/android-cmake/issues/detail?id=16)

3

Здесь есть несколько вопросов.

Похоже, ваши библиотеки повышения были построены без runtime-link=static то есть они не связаны статически со стандартной библиотекой C ++. Если бы они были, постфиксы их имен должны содержать s (см. повысить документы по именованию библиотек)

Другая проблема в том, что CMake FindBoost module ожидает COMPONENTS Аргументы должны иметь форму «date_time», «thread», а не полное имя, как вы указали.

Еще один более важный момент заключается в том, что вам не нужно устанавливать Boost_INCLUDE_DIR или же Boost_LIBRARY_DIR; они устанавливаются модулем CMake в случае успеха. Однако их установка не должна вызывать проблем, это просто ненужный беспорядок.

Также для BOOST_ROOT, BOOST_INCLUDEDIR, а также BOOST_LIBRARYDIRобычно они устанавливаются через командную строку, используя -D или установите в качестве переменных среды, чтобы избежать жестких путей, специфичных для вашей машины, в CMakeLists.txt.

И последнее, что вы должны удалить link_directories вызов. Его собственная документация препятствует его использованию, и в этом нет необходимости, так как вы уже проходите полные пути к буст-библиотекам в target_link_libraries вызов.

Итак, финальная версия должна быть больше похожа на:

#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=...
2

Я столкнулся с той же проблемой. Я создал буст, используя этот репозиторий Boost для Android и я получил только статические библиотеки.

Я не думаю, что вам действительно нужно использовать cmake’s 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}

Единственное, что я могу здесь упомянуть, это не забыть cmake var ${CMAKE_SOURCE_DIR} в set_target_properties функция.

0
По вопросам рекламы [email protected]