首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么CMake要从INCLUDE_DIRECTORIES()调用中删除一些包含目录?

为什么CMake要从INCLUDE_DIRECTORIES()调用中删除一些包含目录?
EN

Stack Overflow用户
提问于 2019-10-24 12:11:50
回答 1查看 1.6K关注 0票数 2

我们正试图交叉编译一个特定的软件,在大多数情况下,它一直在工作。但是,包含文件被拆分到多个目录中,如果目录位于sysroot树之外,有时CMake决定不将其添加到Makefiles的包含列表中。

工具链是:

executables)

  • MinGW
  • GCC 4.4.1 (windows
  • Make (No MSYS)

)

CMake调用如下:

代码语言:javascript
运行
复制
cmake -G"MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE=toolchain-vde.cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=C:\vf-install ..

toolchain-vde.cmake文件是:

代码语言:javascript
运行
复制
# 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:\VDE\ADKs\default\vos\include参数,但是如果目录不存在,makefiles 将使用正确的-I[...]参数。

如果我添加INCLUDE_DIRECTORIES,如:

代码语言:javascript
运行
复制
INCLUDE_DIRECTORIES(
  "X:\\"
  "C:\\VDE\\ADKs\\default\\vos\\include"
  "Y:\\"
)

X:Y:都将以-IX:\ -IY:\的形式出现在编译器调用中,但中间包含的内容不知何故丢失了。奇怪的是,如果我在配置期间重命名包含目录(所以cmake找不到它),那么在编译期间重命名它,CMake添加了正确的-I[...]参数,程序编译得很好。

作为一种解决办法,现在我正在对CMAKE_C_FLAGSCMAKE_CXX_FLAGS变量上的CMAKE_CXX_FLAGS参数进行硬编码,但是这个解决方案非常、非常、非常不正确。

编辑:MESSAGE调用在CMake配置期间显示正确的路径/值。所以它不应该是一个“变量没有定义”的问题。

从本质上说,为了使这成为一个恰当的问题:

为什么INCLUDE_DIRECTORIES CMake从调用中删除或忽略包含路径?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-28 10:49:57

过了几天,我找不到更好的答案,所以我会贴出这个答案,因为它有效。

在编译器检测期间,CMake将提取一系列隐式包含路径,这些路径通常都是可用的,如果添加到包含路径,则可能会中断编译过程(这要感谢@Tsyvarev作为警告)。但是,如果该路径被错误地添加到被排除的路径中,则唯一可以重写该路径的方法是使用以下全部方法删除排除列表:

代码语言:javascript
运行
复制
unset(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES)
unset(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES)

正如在https://gitlab.kitware.com/cmake/cmake/issues/17966上所描述的,但是这个解决方案使用的是CMake内部,因此它可能会执行或中断,这取决于您的编译器或环境。在这种特殊情况下,修复工作正常。

在类似的情况下,再次使用专有+古代gcc工具链,简单地更新到最新的CMake版本就成功了,显然是因为编译器检测得更好。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58541131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档