Опция CMAKE для включения каталога
Пытаюсь скомпилировать OPENCV в системе на основе ARM-Linux. Для этого я создал cmake-файл toolchain со следующими параметрами
SET (CMAKE_SYSTEM_NAME Linux)
SET (CMAKE_SYSTEM_VERSION 1)
SET (CMAKE_SYSTEM_PROCESSOR arm)
SET (CMAKE_C_COMPILER "/usr/local/arm/4.3.1-eabi-armv6/usr/bin/arm-linux-gcc")
SET (CMAKE_CXX_COMPILER "/usr/local/arm/4.3.1-eabi-armv6/usr/bin/arm-linux-g++")
SET (CMAKE_FIND_ROOT_PATH "/usr/local/arm/4.3.1-eabi-armv6/")
SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET (LIBRARY_OUTPUT_PATH "/home/xxx/OpenCV-2.4.3/lib")
SET (OPENCV_CONFIG_FILE_INCLUDE_DIR "/home/xxx/OpenCV-2.4.3")
SET (OPENCV_WARNINGS_ARE_ERRORS OFF)
После запуска команды cmake и команды make я получаю следующую ошибку:
In file included from /usr/local/arm/4.3.1-eabi-armv6/usr/bin-ccache/../lib/gcc/arm-samsung-linux-gnueabi/4.3.1/../../../../arm-samsung-linux-gnueabi/include/c++/4.3.1/bits/postypes.h:47,
from /usr/local/arm/4.3.1-eabi-armv6/usr/bin-ccache/../lib/gcc/arm-samsung-linux-gnueabi/4.3.1/../../../../arm-samsung-linux-gnueabi/include/c++/4.3.1/iosfwd:47,
from /usr/local/arm/4.3.1-eabi-armv6/usr/bin-ccache/../lib/gcc/arm-samsung-linux-gnueabi/4.3.1/../../../../arm-samsung-linux-gnueabi/include/c++/4.3.1/ios:44,
from /usr/local/arm/4.3.1-eabi-armv6/usr/bin-ccache/../lib/gcc/arm-samsung-linux-gnueabi/4.3.1/../../../../arm-samsung-linux-gnueabi/include/c++/4.3.1/ostream:45,
from /usr/local/arm/4.3.1-eabi-armv6/usr/bin-ccache/../lib/gcc/arm-samsung-linux-gnueabi/4.3.1/../../../../arm-samsung-linux-gnueabi/include/c++/4.3.1/iostream:45,
from /home/zwang/OpenCV-2.4.3/3rdparty/openexr/Half/half.h:88,
from /home/zwang/OpenCV-2.4.3/3rdparty/openexr/Half/half.cpp:48:
/usr/local/arm/4.3.1-eabi-armv6/usr/bin-ccache/../lib/gcc/arm-samsung-linux-gnueabi/4.3.1/../../../../arm-samsung-linux-gnueabi/include/c++/4.3.1/cwchar:52:24: error: wchar.h: No such file or directory
Подводя итог: компилятор не может найти wchar.h, stdio.h, wctype.h, ctype.h. Эти заголовки находятся в /usr/local/arm/4.3.1-eabi-armv6/usr/include . Я думаю, мне нужно включить эту папку, используя параметры cmake. Как я могу это сделать?
4 ответа
Вы можете сделать это через include_directories
команда:
include_directories(SYSTEM /usr/local/arm/4.3.1-eabi-armv6/usr/include)
Более надежным решением будет поиск заголовка в этом пути, и, если он найден, включите каталог, иначе произойдет сбой. Помимо того, что он более надежен, чем жесткое кодирование локального пути в вашем CMakeLists.txt, еще одним преимуществом является то, что он дает сбой во время выполнения CMake, а не во время сборки позже. Это лучше всего сделать, используя find_path
,
Например, вы можете сделать:
find_path(WcharPath wchar.h PATHS /usr/local/arm/4.3.1-eabi-armv6/usr/include)
if(WcharPath)
include_directories(SYSTEM ${WcharPath})
else()
message(FATAL_ERROR "Failed to find wchar.h")
endif()
Вы можете установить CMAKE_SYSROOT, чтобы решить эту проблему. Похоже, вы должны установить его
/usr/local/arm/4.3.1-eabi-armv6/
в этом случае.
http://www.cmake.org/cmake/help/v3.0/manual/cmake-toolchains.7.html
Вы должны поместить это в свой файл набора инструментов, так как расположение заголовков зависит от конкретного развертывания набора инструментов:
set(CMAKE_CXX_FLAGS "-isystem /usr/local/arm/4.3.1-eabi-armv6/usr/include")
set(CMAKE_C_FLAGS "-isystem /usr/local/arm/4.3.1-eabi-armv6/usr/include")
Вы можете установить CMAKE_INCLUDE_PATH
в качестве переменной среды описание формата доступно в документации CMAKE: