[我们正在尝试交叉编译某个软件,并且在大多数情况下它一直在工作。但是,包含文件被拆分到多个目录中,并且,如果目录位于sysroot树之外,则有时CMake决定不将其添加到Makefile的包含列表中。]
工具链为:
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
调用中删除或忽略包含路径?
在编译器检测期间,CMake将提取一系列通常始终可用的隐式包含路径,如果将其添加为包含路径,则可能会破坏编译过程(感谢@Tsyvarev进行警告)。但是,如果此路径被错误地添加到排除的路径中,我唯一可以找到的替代方法是使用以下方法一起删除排除列表: