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

问题描述 投票:0回答:1

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

工具链为:

  • 用于ARM的GCC 4.4.1(Windows可执行文件)
  • MinGW Make(没有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:\VDE\ADKs\default\vos\include参数,但是如果目录不存在,则makefiles [[将具有是正确的-I[...]参数。如果添加INCLUDE_DIRECTORIES如:

INCLUDE_DIRECTORIES( "X:\\" "C:\\VDE\\ADKs\\default\\vos\\include" "Y:\\" )

两者X: 

Y:在编译器调用中都将显示为-IX:\ -IY:\,但中间缺少中间包含。奇怪的是,如果我在配置过程中重命名了include目录(因此cmake找不到它),然后在编译过程中重命名了它,则CMake添加了正确的-I[...]参数,程序就可以正常编译。作为一种解决方法,现在我正在-I[...]CMAKE_C_FLAGS变量上对CMAKE_CXX_FLAGS参数进行硬编码,但是这种解决方案远非正确。

edit:

MESSAGE调用在CMake配置期间显示正确的路径/值。因此,它不应该是“未定义变量”的问题。
从本质上讲,这是一个正确的问题:

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

] >>
[我们正在尝试交叉编译某个软件,并且在大多数情况下它一直在工作。但是,包含文件会拆分到多个目录中,并且如果目录位于...
c++ c cmake include cross-compiling
1个回答
0
投票
几天后,我找不到更好的答案,因此我会自行发布此答案,因为它可以正常工作。

在编译器检测期间,CMake将提取一系列通常始终可用的隐式包含路径,如果将其添加为包含路径,则可能会破坏编译过程(感谢@Tsyvarev进行警告)。但是,如果此路径被错误地添加到排除的路径中,我唯一可以找到的替代方法是使用以下方法一起删除排除列表:

© www.soinside.com 2019 - 2024. All rights reserved.