【问题标题】:CMAKE option to include a directory包含目录的 CMAKE 选项
【发布时间】:2013-03-04 19:12:17
【问题描述】:

我正在尝试在基于 ARM-linux 的系统上编译 OPENCV。为此,我创建了一个带有以下选项的工具链 cmake 文件

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 选项包含这个文件夹。我怎样才能做到这一点?

【问题讨论】:

    标签: c++ opencv cmake cross-compiling


    【解决方案1】:

    您可以通过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()
    

    【讨论】:

    • 我需要在 CMakeLists.txt 中包含这个吗?
    • @user1443452 - 是的。请参阅我的编辑以获得更强大的解决方案。
    • 非常感谢弗雷泽...即使在包含您的调整之后我也遇到了同样的错误..使用 gcc 编译的文件工作正常。但是用 g++ 编译的文件会产生这个错误。
    • @user1443452 我对 ARM 不熟悉。作为猜测,您是否尝试将CXX 添加到project 命令中的语言列表中?见the docs
    • @user1443452 - 我只是注意到你从未真正提到过你正在交叉编译。我假设您正在交叉编译?否则你不应该需要工具链文件。
    【解决方案2】:

    您可以设置 CMAKE_SYSROOT 来解决这个问题。看来您应该将其设置为

    /usr/local/arm/4.3.1-eabi-armv6/
    

    在这种情况下。

    http://www.cmake.org/cmake/help/v3.0/manual/cmake-toolchains.7.html#cross-compiling

    【讨论】:

      【解决方案3】:

      您可以将CMAKE_INCLUDE_PATH 设置为环境变量,格式说明可在CMAKE 文档中找到:

      http://www.cmake.org/Wiki/CMake_Useful_Variables

      【讨论】:

      • 使用了这个选项 .. SET (CMAKE_INCLUDE_PATH "/usr/local/arm/4.3.1-eabi-armv6/usr/include") .. 但同样的错误
      • 这只会将目录带入 CMake 自己使用的范围 - 如果您想查找文件/lib/etc,这很有用。并希望 CMake 始终查看给定的路径。查看文档,例如find_file,尤其是第 1 点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多