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

标签 c++ cmake cross-compiling

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

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

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

在我的程序的 CMakeLists.txt 中,我正在寻找 Poco like

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

最佳答案

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

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

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

成功了。

我最终使用自己的 FindPoco.cmake(this 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})

还可以更短。

关于c++ - 为什么在交叉编译时 CMAKE_FIND_ROOT_PATH 和 CMAKE_INCLUDE_PATH 不覆盖我的根文件系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25848220/

相关文章:

c++ - 将 Cmake 与 Qt Creator 一起使用

c++ - 用cmake分离googletest测试用例

linker - 交叉编译的应用程序链接到错误的库?

c++ - 无法破译 “error: expected unqualified-id before ' int'”

c++:打印具有指定长度的字符串

c++ - 离屏渲染 opengl 4.5 多采样 FBO

c++ - C++中的整数字节交换

cmake - 使用 cmake 创建多个 Debian 软件包

java - Android SDK跨平台

.net - 什么是交叉编译器和跨平台?