CMake 添加不区分大小写的源文件

CMake adding case insensitive source files

本文关键字:源文件 大小写 添加 不区 CMake      更新时间:2023-10-16

我正在尝试在 linux 中为具有 CMakeList 的现有项目原生构建二进制文件.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 的问题。我正在寻找一种解决方案,允许我更改.cpp文件中的所有#include <....>行以匹配现有的头文件名,而不是更改 .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

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

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

我永远不会完成任何事情

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

您可以尝试使用file方法来收集需要构建的所有文件,例如:

file(GLOB SRCS "*.cpp")
file(GLOB HDRS "*.h")
add_executable(${PROJECT_NAME} ${HDRS} ${SRCS})

UPD:这样,您只能收集任何文件,无论它们的名称是什么。您最好通过一些脚本更改文件名。

如果您使用的编辑器允许您查找和替换整个项目,则手动更改整个项目的大写可能并不困难。

有像Visual Studio 2017和Atom这样的例子。

只需尝试按 ctrl + shift + H。