CMake find_path适用于Linux但不适用于MingW。我该如何解决?

时间:2017-01-18 12:03:24

标签: linux path cmake find

在Linux系统上:

执行以下命令:

mkdir test
cd test
mkdir mingw linux files
touch files/blah

添加以下CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)
PROJECT(TEST LANGUAGES CXX)

find_path(BLAH_DIR
    blah
    PATHS ${CMAKE_CURRENT_SOURCE_DIR}/files
)
message(STATUS "BLAH_DIR=${BLAH_DIR}")

在“mingw”文件夹中运行带有mingw工具链文件的cmake,如下所示:

# the name of the target operating system
SET(CMAKE_SYSTEM_NAME Windows)

# which compilers to use for C and C++
SET(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
SET(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)

# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32 )

# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search 
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

在“linux”文件夹中,只需运行cmake。

对于MingW,我们得到:

BLAH_DIR=BLAH_DIR-NOTFOUND

对于Linux,我们得到:

BLAH_DIR=/Development/test/files

正如所料。

为什么find_path不能用于MingW? 我应该提交有关CMake的错误报告吗?

2 个答案:

答案 0 :(得分:2)

感谢Tsyvarev提供的有用信息。

标题部分的答案是“如何解决这个问题?”是在find_path命令中指定NO_CMAKE_FIND_ROOT_PATH和NO_DEFAULT_PATH。

答案 1 :(得分:1)

它写在你的工具链文件中:

  

目标环境

中搜索标题和库

命令find_path搜索标题,因此仅在/usr/x86_64-w64-mingw32下查找。

甚至 PATH 选项前置有该根路径。因此它无法找到位于源树中的文件。

请参阅documentation了解find_path命令,my answer查看相关问题。