CMake QNX crosscompile find_path и find_library работает в Linux, но не в Windows

# Try to find IntelIPP
# Once done, this will define
#
#  Ipp_FOUND - system has IntelIPP
#  Ipp_INCLUDE_DIR - the IntelIPP include directories
#  Ipp_LIBRARY - link these to use IntelIPP

include(LibFindMacros)

set(IPP_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../libs/intel/linux/intel_ipp)
# Include dir
find_path(Ipp_INCLUDE_DIR
  NAMES ipp.h
  PATHS ${IPP_ROOT_DIR}/include
)

find_library(Ipp_IRC_LIB
  NAMES irc
  PATHS ${IPP_ROOT_DIR}/lib/ia32
)


find_library(Ipp_MAT_LIB
  NAMES ippm
  PATHS ${IPP_ROOT_DIR}/lib/ia32
)

list(APPEND Ipp_LIBRARY ${Ipp_IRC_LIB} ${Ipp_MAT_LIB} )

include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set Ipp_FOUND to TRUE
# if all listed variables are TRUE
find_package_handle_standard_args(Ipp DEFAULT_MSG 
                                    Ipp_LIBRARY Ipp_INCLUDE_DIR)

# Set the include dir variables and the libraries and let libfind_process do the rest.
# NOTE: Singular variables for this library
set(Ipp_INCLUDE_DIRS ${Ipp_INCLUDE_DIR})
set(Ipp_LIBRARIES ${Ipp_LIBRARY})

Мой скрипт FindIpp.cmake показан выше. В Windows я получаю -- Could NOT find IPP (missing: IPP_INCLUDE_DIR IPP_LIBRARY). Я тестировал это в Linux, и он работает без проблем. В обоих случаях я пытаюсь выполнить кросс-компиляцию с помощью набора инструментов QNX Momentics.

  • $ {CMAKE_CURRENT_SOURCE_DIR} - это расположение «корневого» скрипта, который включает (FindIpp).
  • Я просмотрел вывод $ {CMAKE_CURRENT_SOURCE_DIR} и вывод относительных путей, чтобы убедиться, что файлы и папки существуют в указанных путях. $ {CMAKE_CURRENT_SOURCE_DIR} /../ libs / intel отображается как C: /../ libs / intel.
  • Я использую CMake 3.5 в Linux и CMake 3.6.1 в Windows 7.
  • В командной строке я мог без проблем ввести cd c: / libs / intel.
  • Я попытался жестко закодировать путь IPP_ROOT_DIR к set(IPP_ROOT_DIR C:/libs/intel/linux/intel_ipp), попытался добавить кавычки вокруг пути, добавил CACHE PATH "Description" к вызову set. Ничего из этого не сработало.
  • Я пробовал -GNinja, -G "MinGW Makefiles" и -G "Unix Makefiles". Еще придумал:

    -- Could NOT find IPP (missing:  IPP_INCLUDE_DIR IPP_LIBRARY) 
    -- Could NOT find Mkl (missing:  Mkl_LIBRARY Mkl_INCLUDE_DIR) 
    -- Could NOT find Boost (missing:  Boost_LIBRARY Boost_INCLUDE_DIR) 
    -- Could NOT find GTest (missing:  GTEST_LIBRARY GTEST_MAIN_LIBRARY) 
    
  • Копирование и вставка содержимого из отдельных файлов, таких как FindIpp.cmake, в основной файл CMakeLists.txt находит библиотеки, но не путь для включения. Теперь я также добавил list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SRC_DIR}/CMake/Modules), чтобы найти файлы моего модуля. Если я удалю эту строку, cmake выдаст ошибку include(FindIpp). Есть ли что-нибудь очевидное, что я делаю не так? Кроме того, можно ли так написать find_library или find_path? Спасибо


person Sriram    schedule 02.08.2016    source источник
comment
Если у вас есть проблема с find_library вызовом, протестируйте этот вызов напрямую с жестко запрограммированными значениями. В этом случае нет необходимости отлаживать весь Find*.cmake скрипт. Что касается кросс-компиляции, проверьте, какие пути инструментальной цепочки позволяет искать: основные, целевые или и то, и другое. См. Описание переменной CMAKE_FIND_ROOT_PATH_MODE_LIBRARY.   -  person Tsyvarev    schedule 02.08.2016
comment
Пытался позвонить напрямую. Не повезло. Кроме того, set(IPP_ROOT_DIR "C:/libs/intel/linux/intel_ipp") message(STATUS "IPP_ROOT_DIR: " ${IPP_ROOT_DIR}) не печатает IPP_ROOT_DIR в моем выводе.   -  person Sriram    schedule 03.08.2016
comment
Итак, как насчет toolchain, который может повлиять на find_* команды? Попробуйте создать проект изначально (например, с помощью компилятора Visual Studio или с помощью gcc под MinGW). Если find_path работает в такой сборке, то ваш набор инструментов однозначно на это повлияет.   -  person Tsyvarev    schedule 03.08.2016
comment
Собственная сборка с использованием компилятора Visual Studio и Ninja отлично работает. Это как-то связано с набором инструментов.   -  person Sriram    schedule 04.08.2016


Ответы (1)


Итак, правильный способ кросс-компиляции в QNX из Windows и Linux:

cmake -DCMAKE_SYSTEM_NAME="QNX" -DCMAKE_SYSTEM_VERSION="660" -DCMAKE_SYSTEM_PROCESSOR="x86" -GNinja path_to_project

Где 660 - это QNX версии 6.6.0. Я использовал свой собственный файл Toolchain для QNX. В этом нет необходимости. Один из них уже предоставлен в разделе share / cmake- / Modules / Platform. Итак, пока мы где-то определяем указанную выше переменную CMAKE, все будет в порядке.

person Sriram    schedule 04.08.2016