cygwin cmake无法找到boost库
我知道这已经被问了好几次了,但我似乎已经正确设置了所有必需的变量,而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 | | -
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的期望。