2017-01-18 11 views
1

В системе Linux:CMake find_path работает на Linux, но не на MingW. Как это исправить?

Выполните следующие команды:

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" Папка выполнения CMake с файлом ToolChain MinGW например:

# 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" f старше, просто запустить cmake.

Для MingW мы получаем:

BLAH_DIR=BLAH_DIR-NOTFOUND 

Для Linux мы получаем:

BLAH_DIR=/Development/test/files 

, как и ожидалось.

Почему не работает find_path для MingW? Должен ли я отправлять отчет об ошибке на CMake?

ответ

2

Благодаря Цывареву за полезную информацию.

Ответ на часть заголовка, в которой говорится: «Как мне исправить это?» это указать NO_CMAKE_FIND_ROOT_PATH и NO_DEFAULT_PATH в команде find_path.

1

написано в файле ToolChain:

поиска заголовки и библиотеки в целевой среды

Команда find_path обысков заголовков, так это выглядит только под /usr/x86_64-w64-mingw32.

Даже PATH опция добавлена ​​с этим корневым путем. Поэтому он не может найти файл, расположенный в исходном дереве.

documentation для find_path command, my answer относящийся к вопросу.

+0

Я посмотрел документацию и пропустил в стене текста бит, в котором говорилось, что корневой путь добавлен ко всему. (Я забыл спросить), как я могу это решить? – AlastairG

+0

'как это решить?' - например, удалите строку 'set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ТОЛЬКО)' из инструментальной цепочки, поэтому будет также искать среду хоста. – Tsyvarev

+0

Это не сработает, поскольку я использую find_path, который может быть любым файлом, не обязательно включаемым файлом, а во-вторых, он может перехватить мой кросс-компилятор, включив файлы из хост-системы, которые должны быть включены только из целевой системы. – AlastairG