首页 > 解决方案 > CMake添加不区分大小写的源文件

问题描述

我正在尝试在 linux 中为已经构建 CMakeLists.txt 的现有项目构建二进制文件。我一直遇到 CMakeLists.txt 尝试添加头文件或源文件但无法添加的问题。源文件存在于其查找的目录中,但案例不匹配。例如,这是标题搜索之一:

set(Headers
    resource.h
    stdafx.h
    ...
)

我收到一条错误消息fatal error: stdafx.h: No such file or directory,但目录中的文件StdAfx.h不是stdafx.h. 显然 CMake 无法建立这些是相同文件的连接。

我的问题是,这个项目文件有 6 GB 的代码,如果我必须进入并更改每个大写错误的文件的包含,我永远不会完成任何事情。有没有办法告诉 CMake 文件名可能有不同的大小写?还是我坚持手工做所有事情,直到它起作用。

编辑:它看起来好像是区分大小写的 Linux 文件系统,所以我删除了 cmake 标签,因为它不是 cmake 的问题。我正在寻找一种解决方案,允许我更改#include <....>.cpp 文件中的所有行以匹配现有的头文件名,而不是更改 .h 文件名。

编辑:对于以后来这里的人来说,完整的错误是这样的:

[ 1%] Building CXX object Source/UeiSimuDriver/CMakeFiles/UeiSimuDriver_vc15.dir/StdAfx.cpp.o
In file included from /var/tmp/<workspaceHash>/Framework/Source/UeiSimuDriver/StdAfx.cpp:2 
fatal error: stdafx.h: No such file or directory
#include "stdafx.h"
compilation terminated

标签: c++linuxcmake

解决方案


问题不在于 cmake,而在于文件系统。linux 中的文件系统通常区分大小写。stdafx.h 与 Stdafx.h 不是同一个文件。如果您的 CMakeLists.txt 和源文件使用了与文件名不匹配的错误大小写,则该项目与 linux 及其文件系统不兼容。因此,您的选择是:

  1. 使用不区分大小写的文件系统,因为这是项目支持的
    1. 您可以在 linux 上尝试不区分大小写的文件系统,但这是一个 hacky 解决方案。
    2. 使用窗户。
  2. 通过更正 CMakeLists.txt 和包含项中的文件名及其引用来修复项目以支持区分大小写的文件系统。请注意,如果程序是在不区分大小写的文件系统的情况下编写的,则在执行程序时可能会出现更多问题。

我永远不会完成任何事情

简单的解决方案:将所有文件名更改为小写,将 CMakeLists.txt 中的所有引用和源中的包含更改为小写:无需执行比较或尝试找出包含根。两者都可以使用简短的 shell 脚本来执行。虽然技术上不正确,因为源文件具有非常规语法,但正则表达式可能足以匹配包含指令。


推荐阅读