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

时间:2014-09-15 12:32:11

标签: c++ cmake cross-compiling

我已经在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中的主机,而/ 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的显式路径是一个糟糕的选择,因为我需要在不同的平台上编译程序。

1 个答案:

答案 0 :(得分:1)

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

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

    NO_something 中的
  • find_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})

它可能更短。