2016-07-14 2 views
-1

Я знаю, что это было задано несколько раз, но я, кажется, правильно установил все необходимые переменные, и cmake не находит нужные компоненты.cygwin cmake не может найти библиотеки ускорения

Я успешно (с борьбой ...) скомпилированной библиотеки подталкивания, и они имеют эту файловую структуру:

C:\boost_1_57_0 
    | - android 
    | | - lib 
    |   | - libboost_date_time-gcc-mt-s-1_57.a 
    |   | - libboost_random-gcc-mt-s-1_57.a 
    |   | - libboost_system-gcc-mt-s-1_57.a 
    | - boost 
     | - date_time 
     | | - *.hpp 
     | - random 
     | | - *.hpp 
     | - system 
      | - *.hpp 

Это соответствующая часть моего CMake:

option(BUILD_SHARED_LIBS "Build the shared library" OFF) 
option(Boost_USE_STATIC_LIBS "Use Boost static version" ON) 

set(BOOST_VER "1.57.0" CACHE STRING "boost version") 
set(BOOST_ROOT "/cygdrive/c/boost_1_57_0/") 
set(BOOST_INCLUDEDIR "/cygdrive/c/boost_1_57_0/boost/") 
set(BOOST_LIBRARYDIR "/cygdrive/c/boost_1_57_0/android/lib/") 
# I tried also C: instead of /cygdrive/c, with no success 

message(STATUS "BOOST_ROOT = ${BOOST_ROOT}") 
message(STATUS "BOOST_INCLUDEDIR = ${BOOST_INCLUDEDIR}") 
message(STATUS "BOOST_LIBRARYDIR = ${BOOST_LIBRARYDIR}") 

set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 
find_package(Boost ${BOOST_VER} REQUIRED COMPONENTS system date_time random) 

и это который я получаю:

$ cmake ./ 
-- not define build type, set to release 
-- BOOST_ROOT = /cygdrive/c/boost_1_57_0/ 
-- BOOST_INCLUDEDIR = /cygdrive/c/boost_1_57_0/boost/ 
-- BOOST_LIBRARYDIR = /cygdrive/c/boost_1_57_0/android/lib/ 
CMake Error at /usr/share/cmake-3.3.2/Modules/FindBoost.cmake:1245 (message): 
    Unable to find the requested Boost libraries. 

    Boost version: 1.57.0 

    Boost include path: /cygdrive/c/boost_1_57_0 

    Could not find the following static Boost libraries: 

      boost_system 
      boost_date_time 
      boost_random 

    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): 
    CMakeLists.txt:32 (find_package) 

Почему это не работает? И почему я установил BOOST_INCLUDEDIR в /cygdrive/c/boost_1_57_0/boost/, но он, кажется, игнорирует его и ищет файлы include в whatever I set BOOST_ROOT to? И почему он тоже игнорирует BOOST_LIBRARYDIR?

+0

Вы используете кросс-компиляцию для Android. Вы рассказали cmake, который является кросс-компилятором? – matzeri

+0

@matzeri да; но я застрял на шаг раньше. – ocramot

+0

'BOOST_ROOT' имеет приоритет против' BOOST_INCLUDEDIR' и 'BOOST_LIBRARYDIR' при поиске вещей. Поскольку заголовки находятся под 'BOOST_ROOT', другие каталоги не выполняются. Что касается основного вопроса - библиотеки не найдены - установите переменную 'Boost_DEBUG' и проверьте отладочные сообщения, которые будут отображаться во время конфигурации. Они должны получить ключ к этой проблеме. Вероятно, имена библиотек, которые у вас есть, не соответствуют ожиданиям сценария FindBoost.cmake. – Tsyvarev

ответ

0

Хорошо, я нашел причину моей проблемы. Прежде всего я должен был

set(Boost_DEBUG 1) 

в моем CMakeLists.txt, так что FindBoost.cmake, названный find_package(Boost ${BOOST_VER} ...) может напечатать то, что он искал.

Так я узнал, что проблема заключалась в том, что:

-- [ /usr/share/cmake-3.3.2/Modules/FindBoost.cmake:827 ] guessed _boost_COMPILER = -gcc46 

в то время как она должна быть -gcc, и что:

-- [ /usr/share/cmake-3.3.2/Modules/FindBoost.cmake:1052 ] Searching for SYSTEM_LIBRARY_RELEASE: boost_system-gcc46-mt-1_57 

Так я узнал, что переменная Boost_LIB_PREFIX не была установлена.

Первая проблема связана с функцией _Boost_GUESS_COMPILER_PREFIX в FindBoost.cmake. По какой-то причине, у меня были эти переменные:

CMAKE_CXX_COMPILER_ID : GNU #why?? I'm using Cygwin under Windows... 
MINGW : #unset 
UNIX : 1 
CMAKE_COMPILER_IS_GNUCXX : 1 
Boost_MAJOR_VERSION : 1 
Boost_MINOR_VERSION : 57 

Таким образом, в определенный момент:

if(${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION} VERSION_LESS 1.34) 
    set(_boost_COMPILER "-gcc") # no GCC version encoding prior to 1.34 
else() 
    .... 
    set(_boost_COMPILER "-gcc${_boost_COMPILER_VERSION}") 
endif() 

Вторая проблема была из-за этих линий в FindBoost.cmake:

set(Boost_LIB_PREFIX "") 
if ((GHSMULTI AND Boost_USE_STATIC_LIBS) OR 
    (WIN32 AND Boost_USE_STATIC_LIBS AND NOT CYGWIN)) 
    set(Boost_LIB_PREFIX "lib") 
endif() 

I все еще не понимают, почему он не должен добавлять префикс «lib» с cygwin.

В конце концов, я точно не знаю, почему он искал неправильные имена библиотек, может быть, я испортил и скомпилировал с помощью разных инструментов/версий.