2016-07-14 4 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/으로 설정하는 이유는 그가 무시하고 포함 파일을 찾은 것 같습니다. whatever I set BOOST_ROOT to? 그리고 그는 왜 BOOST_LIBRARYDIR도 무시하고 있습니까?

+0

Android 용으로 교차 컴파일합니다. cross-compiler 인 cmake에게 말 했나요? – matzeri

+0

@matzeri 예; 그러나 나는 한 발 전진했다. – ocramot

+0

'BOOST_ROOT'는 검색 할 때'BOOST_INCLUDEDIR'와'BOOST_LIBRARYDIR'에 우선합니다. 헤더가 BOOST_ROOT 아래에 있으므로 다른 디렉토리는 검색되지 않습니다. 주요 질문 - 라이브러리를 찾을 수 없습니다 - Boost_DEBUG 변수를 설정하고 구성 중에 표시 될 디버그 메시지를 확인하십시오. 그들은 문제의 열쇠를 얻어야합니다. 아마 당신이 가지고있는 라이브러리의 파일 이름이'FindBoost.cmake' 스크립트의 기대에 맞지 않을 수도 있습니다. – Tsyvarev

답변

0

좋아, 문제의 원인을 발견했습니다. find_package(Boost ${BOOST_VER} ...)에 의해 호출 FindBoost.cmake, 그는이 검색되었습니다 무엇을 인쇄 할 수 있도록 모든 먼저 나는 나의 CMakeLists.txt에

set(Boost_DEBUG 1) 

했다.

-- [ /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가 설정되지 않았 음을 발견

그래서 나는 문제가 있다는 것을 발견했다.

첫 번째 문제는 FindBoost.cmake에서 _Boost_GUESS_COMPILER_PREFIX 함수 때문이었습니다. 특정 지점에서

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 

: 그래서

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 :

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에서이 라인 때문 어떤 이유로, 나는 이러한 변수를했다 cygwin에 접두사 "lib"를 추가하면 안되는 이유는 아직도 이해가 가지 않습니다.

결국 그가 왜 잘못된 라이브러리 이름을 검색했는지 정확히 알지 못합니다. 어쩌면 엉망이고 다른 도구/버전으로 컴파일했을 수도 있습니다.

관련 문제