cygwin cmake无法找到boost库

cygwin cmake无法找到boost库,boost,cmake,cygwin,Boost,Cmake,Cygwin,我知道这已经被问了好几次了,但我似乎已经正确设置了所有必需的变量,而cmake一直没有找到必需的组件 我成功地(通过斗争…)编译了boost库,它们具有以下文件结构: C:\boost_1_57_0 | - android | | - lib | | - libboost_date_time-gcc-mt-s-1_57.a | | - libboost_random-gcc-mt-s-1_57.a | | -

我知道这已经被问了好几次了,但我似乎已经正确设置了所有必需的变量,而cmake一直没有找到必需的组件

我成功地(通过斗争…)编译了boost库,它们具有以下文件结构:

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\u INCLUDEDIR
设置为
/cygdrive/c/BOOST\u 1\u 57\u 0/BOOST/
,但他似乎忽略了它,并在
中查找包含文件,无论我将BOOST\u ROOT设置为
?为什么他也忽略了BOOST\u LIBRARYDIR?

好的,我找到了问题的原因。 首先我必须

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\u LIB\u PREFIX
没有设置

第一个问题是由于FindBoost.cmake中的
\u Boost\u GUESS\u COMPILER\u 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
所以在某一点上:

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()
我仍然不明白为什么它不应该在cygwin中添加前缀“lib”


最终,我不知道他为什么要搜索错误的库名,可能是我搞错了,用不同的工具/版本编译。

你是在为Android交叉编译。你告诉过cmake哪个是交叉编译器吗?@matzeri是的;但是我之前被卡住了。
BOOST\u ROOT
在搜索内容时优先于
BOOST\u INCLUDEDIR
BOOST\u LIBRARYDIR
。由于在
BOOST\u ROOT
下可以找到标题,因此不会搜索其他目录。至于主要问题-找不到库-设置
Boost\u DEBUG
变量并检查将在配置期间显示的调试消息。他们应该找到问题的答案。可能,您拥有的库的文件名不符合
FindBoost.cmake
script的期望。