为什么在交叉编译时不 cmake CMAKE_FIND_ROOT_PATH 和 CMAKE_INCLUDE_PATH 覆盖我的根文件系统?

Why don't cmake CMAKE_FIND_ROOT_PATH and CMAKE_INCLUDE_PATH override my root filesystem when cross-compiling?

本文关键字:CMAKE PATH INCLUDE 我的 文件系统 覆盖 FIND 交叉编译 为什么 cmake ROOT      更新时间:2023-10-16

我已经成功地在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)/文件系统中的Poko,而/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添加显式路径是一个糟糕的选择,因为我需要在不同的平台上编译程序。

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

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

  • find_path()中的NO_something标志
  • 以及CMAKE_PREFIX_PATHCMAKE_FIND_ROOT_PATH,甚至CMAKE_SYSTEM_LIBRARY_PATH变量

工作。

我最终使用了一个自己的FindPoco.cmake(这个立即生效)和一个构建命令:

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})

它可以更短。