我试图在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无法建立这些文件是相同的连接。
我的问题是,这个项目文件是6GB的代码,如果我必须进入并更改每一个错误大写文件的包含,我永远不会完成任何事情。我有没有办法告诉CMake,文件名可能有不同的大写字母?或者是我把所有的事情都用手做,直到它起作用。
编辑:它看起来好像是区分大小写的Linux文件系统,所以我要删除cmake标记,因为它不是cmake的问题。我正在寻找一种解决方案,允许我更改.cpp文件中的所有.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发布于 2019-12-18 14:35:17
问题不在于cmake,而在于文件系统。linux中的文件系统通常区分大小写。H与Stdafx.h不是同一个文件。如果您的CMakeLists.txt和源文件使用的大小写与文件名不匹配,那么该项目与linux及其文件系统不兼容。所以,你的选择是:
我永远不会完成任何事情
简单解决方案:将所有文件名更改为小写,将CMakeLists.txt中的所有引用和源中的包含更改为小写:不需要执行比较或尝试计算包含根。两者都可以通过一个简短的shell脚本来执行。虽然在技术上不正确,因为源文件具有非规则语法,但正则表达式可能足以匹配包含指令。
发布于 2019-12-18 14:19:14
您可以尝试使用file方法收集需要构建的所有文件,例如:
file(GLOB SRCS "*.cpp")
file(GLOB HDRS "*.h")
add_executable(${PROJECT_NAME} ${HDRS} ${SRCS})UPD: By,所以您只能收集任何文件,不管它们的名称是什么。您最好通过一些脚本更改文件名。
https://stackoverflow.com/questions/59393782
复制相似问题