【问题标题】:Why don't cmake CMAKE_FIND_ROOT_PATH and CMAKE_INCLUDE_PATH override my root filesystem when cross-compiling?为什么 cmake CMAKE_FIND_ROOT_PATH 和 CMAKE_INCLUDE_PATH 在交叉编译时不覆盖我的根文件系统?
【发布时间】:2014-09-15 12:32:11
【问题描述】:

我已经成功地在 Ubuntu/x86_64 上为 ARM 交叉编译了 Poco 库。现在我正在交叉编译一个使用Pococmake 的程序。

我已将目标文件系统上的 Poco 标头和包含安装到 $(SDK_INSTALL_DIR)/filesystem/usr/local/include

我的主机文件系统上还有 Poco 开发库,但它会妨碍我。

在我程序的CMakeLists.txt,我正在寻找像Poco这样的人

find_path(POCO_INCLUDE_PATH "Poco/Net/HTTPClientSession.h" "../include")
MESSAGE(FATAL_ERROR "Poco: " ${POCO_INCLUDE_PATH-NOTFOUND} ":" ${POCO_INCLUDE_PATH})

我不断得到

Poco: :/usr/include

看起来我的主机在 /usr/include 中的 Poco 优先于安装到 $(SDK_INSTALL_DIR)/filesystem 中的 Poco,而 /usr/local 根本不应该被搜索

我正在使用命令运行cmake

. $(SDK_INSTALL_DIR)/environment-setup \
    && mkdir -p $(BANANA_DIR) \
    && cd $(BANANA_DIR) \
    && CMAKE_INSTALL_PREFIX=$(SDK_INSTALL_DIR)/filesystem/usr/local \
        CMAKE_FIND_ROOT_PATH=$(SDK_INSTALL_DIR)/filesystem \
        CMAKE_INCLUDE_PATH=$(SDK_INSTALL_DIR)/filesystem:$(SDK_INSTALL_DIR)/filesystem/usr/include:$(SDK_INSTALL_DIR)/filesystem/usr/local/include \
        CMAKE_LIBRARY_PATH=$(SDK_INSTALL_DIR)/filesystem/usr/lib:$(SDK_INSTALL_DIR)/filesystem/usr/local/lib \
        cmake ..

CMAKE_FIND_ROOT_PATHCMAKE_INCLUDE_PATH 都应该优先,但这并没有发生。

编辑:我正在运行我的主机的cmake。在一个完美的世界里,这应该无关紧要,但我认为这是我的问题之一。交叉编译工具链中没有cmake

如何让我的find_path() 包含正确的Poco?向 CMakeLists.txt 添加显式路径是一个不好的选择,因为我需要在不同平台上编译程序。

【问题讨论】:

  • 有什么特别的原因,为什么要手动交叉编译 Poco?你看过Buildroot这样的项目吗?
  • 试试 find_path(... NO_DEFAULT_PATH) cmake.org/cmake/help/v2.8.12/cmake.html#command:find_path
  • 有:我们有一些特定于供应商的代码,我怀疑它们能否顺利编译 buildroot。我们还有大约数百个其他软件包被编译和预安装为二进制文件,包括内核及其模块。不过感谢您的建议。
  • @Sergey,感谢您将我指向那篇文档:) NO_CMAKE_SYSTEM_PATH 工作。现在我也需要让它在默认路径上工作,以使其成为一个完整的解决方案。

标签: c++ cmake cross-compiling


【解决方案1】:

一个问题部分是复杂的设置 - 我在交叉编译时使用主机的 cmake

另一部分仍不清楚find_path() 行为,其中没有以下组合:

  • NO_somethingfind_path() 中的标志
  • CMAKE_PREFIX_PATHCMAKE_FIND_ROOT_PATH,甚至CMAKE_SYSTEM_LIBRARY_PATH变量

工作。

我最终使用了自己的 FindPoco.cmakethis one 立即生效)和构建命令:

CMAKE_INCLUDE_PATH=$(EXEC_DIR):$(EXEC_DIR)/usr/include:$(EXEC_DIR)/usr/local/include \
    CMAKE_LIBRARY_PATH=$(EXEC_DIR):$(EXEC_DIR)/usr/lib:$(EXEC_DIR)/usr/local/lib \
    POCO_ROOT=$(POCO_DIR) \
    cmake -DPoco_DIR=$(POCO_DIR)/cmake .. \
&& make VERBOSE=1

我的 CMakeLists.txt 现在只像这样提到 Poco:

find_package(Poco REQUIRED)
find_library(POCO_FOUNDATION PocoFoundation ${Poco_LIBRARY_DIRS} REQUIRED)
find_library(POCO_NET PocoNet ${Poco_LIBRARY_DIRS} REQUIRED)

include_directories(${Poco_INCLUDE_DIR})
target_link_libraries(detect ${POCO_FOUNDATION} ${POCO_NET})

它可能会更短。

【讨论】:

  • 我愿意接受对find_path() 的更好解释作为答案。
猜你喜欢
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 2022-07-04
  • 1970-01-01
相关资源
最近更新 更多