为什么在交叉编译时不 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?
我已经成功地在Ubuntu/x86_64上为ARM交叉编译了一个Poco
库。现在我正在交叉编译一个使用Poco
和cmake
的程序。
我已经安装了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_PATH
和CMAKE_INCLUDE_PATH
都应该优先,但这并没有发生。
编辑:我正在运行主机的cmake
。在一个完美的世界里,这应该无关紧要,但我认为这是我的问题之一。交叉编译工具链中没有cmake
。
如何使我的find_path()
包含正确的Poco
?向CMakeLists.txt添加显式路径是一个糟糕的选择,因为我需要在不同的平台上编译程序。
一个问题部分是复杂的设置——交叉编译时我使用主机的cmake
。
另一部分是仍然不清楚的find_path()行为,其中没有以下各项的组合:
find_path()
中的NO_something
标志- 以及
CMAKE_PREFIX_PATH
、CMAKE_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})
它可以更短。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用CMake创建QML插件
- cmake如何在fedora工作站中找到boost静态库包
- 使用CMake检测支持的C++标准
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 如何使用CMake编译.proto文件来生成.grpcp.pb.cc和.grpc.pb.h文件
- cmake在我的项目中所需的所有静态库都不成功
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 无法链接 CMake 中的本地库
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何在Ubuntu中使用cmake设置qt4
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 为什么 cmake 许可证<>样式不包括?
- cmake更新缓存的变量
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 使外部项目可用于find_package CMake
- MSYS2 CMAKE PATH前缀为Windows格式(C:/),但需要MSYS2/*NIX样式(/C/)才能链接
- CMAKE CMAKE_C_COMPILER "is not a full path to an existing compiler tool"