为什么CMake要从include_directories()调用中删除一些包含目录
Why is CMake removing some include directories from INCLUDE_DIRECTORIES() calls?
我们正在尝试交叉编译某个软件,在大多数情况下,它一直在工作。但是,include文件被拆分为多个目录,如果目录位于sysroot树之外,有时CMake会决定不将其添加到Makefiles的include列表中。
工具链是:
- GCC 4.4.1 for ARM(windows可执行文件(
- MinGW品牌(无MSYS(
CMake调用如下:
cmake -G"MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE=toolchain-vde.cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=C:vf-install ..
toolchain-vde.cmake
文件为:
# the name of the target operating system
set(CMAKE_SYSTEM_NAME Linux)
# which compilers to use for C and C++
include(CMakeForceCompiler)
#Use 8.1 names if path has spaces since it will break on paths with spaces
set(CMAKE_C_COMPILER "C:/VDE/toolchains/windows/vos/arm-vf-linux-gnueabi/bin/arm-vf-linux-gnueabi-gcc.exe")
set(CMAKE_CXX_COMPILER "C:/VDE/toolchains/windows/vos/arm-vf-linux-gnueabi/bin/arm-vf-linux-gnueabi-g++.exe")
# here is the target environment located
SET(VF_SYSROOT "C:/VDE/SDKs/vos/default")
#Vf includes and libs
#Declared as variables for compatibility and usage by CMake scripts down the line
SET(VF_ADK_INCLUDE "C:\VDE\ADKs\default\vos\include")
SET(VF_ADK_LIB "C:/VDE/ADKs/default/vos/lib")
SET(VF_SDK_USR_LIB "${VF_SYSROOT}/usr/lib")
SET(VF_SDK_USR_LOCAL_LIB "${VF_SYSROOT}/usr/local/lib")
SET(VF_SDK_USR "${VF_SDK_USR_LIB}") #<-- Compatibility with old Vf detection
SET(VF_SVCMGR "${VF_SYSROOT}/usr/local/lib/svcmgr")
MESSAGE("debug1: --- ${VF_ADK_INCLUDE} --- ${VF_SYSROOT} ---")
SET(CMAKE_SYSROOT "${VF_SYSROOT}")
#Define variables for compiler and CMAKE scripts
set(VF_UX_410 TRUE)
add_definitions(-DVF_UX_410="${VF_UX_410}")
LINK_DIRECTORIES("${CMAKE_INSTALL_PREFIX}/lib")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lrt --std=gnu99")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lrt")
LIST(APPEND CMAKE_PREFIX_PATH "${CMAKE_INSTALL_PREFIX}")
INCLUDE_DIRECTORIES("${CMAKE_INSTALL_PREFIX}/include")
INCLUDE_DIRECTORIES("${VF_ADK_INCLUDE}")
请注意最后一行INCLUDE_DIRECTORIES("${VF_ADK_INCLUDE}")
这个目录VF_ADK_INCLUDE
,如果它存在,将在构建过程中被忽略。这意味着make
调用将没有-IC:VDEADKsdefaultvosinclude
参数,但如果目录不在那里,makefiles将有正确的-I[...]
参数。
如果我添加INCLUDE_DIRECTORIES
,例如:
INCLUDE_DIRECTORIES(
"X:\"
"C:\VDE\ADKs\default\vos\include"
"Y:\"
)
X:
和Y:
都将作为-IX: -IY:
出现在编译器调用中,但不知何故,中间的include丢失了。奇怪的是,如果我在配置过程中重命名include目录(所以cmake找不到它(,然后在编译过程中重新命名,cmake添加了正确的-I[...]
参数,程序编译得很好。
作为一种变通方法,现在我正在对CMAKE_C_FLAGS
和CMAKE_CXX_FLAGS
变量硬编码-I[...]
参数,但这种解决方案远非正确。
编辑:MESSAGE
调用在CMake配置期间显示正确的路径/值。因此,这不应该是一个"变量未定义"的问题。
本质上,为了让这成为一个恰当的问题:
为什么CMake从INCLUDE_DIRECTORIES
调用中删除或忽略include路径
几天后,我找不到更好的答案,所以我会把这个答案发布给自己,因为它有效。
在编译器检测过程中,CMake将提取一系列通常可用的隐式包含路径,如果添加到包含路径中,可能会中断编译过程(感谢@Tsyvarev的警告(。但是,如果这个路径被错误地添加到排除的路径中,我能找到的唯一方法就是使用一起删除排除列表
unset(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES)
unset(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES)
如上所述https://gitlab.kitware.com/cmake/cmake/issues/17966但这个解决方案使用CMake内部,因此它可能会根据编译器或环境而起作用或中断作用。在这种特殊的情况下,修复成功了。
在类似的情况下,同样使用专有+古老的gcc工具链,简单地更新到最新的CMake版本就可以了,这显然是由于更好的编译器检测。
- 是否需要删除包含对象的"pair"?
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 删除包含包含动态对象的 STL 容器的智能指针
- 如何删除包含其他向量的向量?
- QT C++删除带有 *(名称包含)的文件
- 为什么CMake要从include_directories()调用中删除一些包含目录
- 不带初始值设定项的构造函数列表,其中包含带有已删除构造函数的对象
- 删除外部包含代码库中的删除
- 删除包含结构的向量的向量
- 仅在删除包含对象的向量时调用自定义»析构函数«
- 如何从 qmake 中的包含路径中删除项目的根目录
- 删除包含单词的行
- C++析构函数删除包含动态数组作为数据成员的对象时的用法
- C++ - 删除包含向量的结构向量是否会导致内存泄漏
- In code-删除包含文件的文件夹
- 删除包含其他实例的实例的操作符
- 如何删除包含文件的文件夹
- vs2015 上的 stl 列表性能不佳,同时删除包含迭代器到自身在列表中的位置的节点
- C++ 删除包含新结构数组的新结构数组的正确方法
- 搜索一个值,然后从对象数组中删除包含该值的对象