CMake 找不到源文件,但在 TFS 构建定义中的 CMakeLists.txt 中未指定文件

Posted

技术标签:

【中文标题】CMake 找不到源文件,但在 TFS 构建定义中的 CMakeLists.txt 中未指定文件【英文标题】:CMake cannot find source file, but file was not specified in CMakeLists.txt, in TFS build definition 【发布时间】:2021-03-23 01:18:22 【问题描述】:

我正在将一个大型项目移植到 linux。我编写了所有的 CMakeLists.txt 文件,所有内容都在我的机器上编译。

无论出于何种原因,我们仍然使用 TFS。旧版本,不是带有 TFS 的 git。

我在自己的分支中工作,但该分支没有针对 linux 的构建定义。在我签入之前,我想确保一切都在服务器上编译。所以我需要将我的分支合并到另一个分支,并将搁置集提交给构建作业。

在我的机器上,一切都编译得很好。但是当我在服务器中运行构建,将一个搁置集应用到具有 linux 构建定义的分支时,我从构建中得到一个错误,说

CMake Error at 
/myproject/subproject/CMakeLists.txt:165 (add_library):
  Cannot find source file:

/myproject/subproject/IInternalTransactionManager.h

  Tried extensions .c .C .c++ .cc .cpp .cxx .cu .m .M .mm .h .hh .h++ .hm
  .hpp .hxx .in .txx

确实,该文件不存在。 Cmake 抱怨文件不在源目录中,这是真的,因为它在另一个目录中。但事实是我也没有要求!我的 CMakeFiles.txt 文件不包含该文件。该文件是在少数文件中使用的标头,仅包含类定义(无实现),并且 myHeader.h 所在的目录已在 include_directories 中定义。我的 CMakeLists.txt 看起来像这样:

set(PROJECT_NAME project)
project($PROJECT_NAME)
include_directories(
  ../_include
)

set(source_files
  main.cpp
  file_that_includes_myHeader.cpp
)

add_library( $PROJECT_NAME STATIC $source_files )

我的文件结构是这样的:

/myproject/subproject/main.cpp
/myproject/subproject/file_that_includes_myHeader.cpp
/myproject/subproject/CMakeLists.txt
/myproject/_include/myHeader.h

那么,如果 CMakeLists.txt 文件中不包含该文件,为什么 cmake 会抱怨丢失的文件?为什么这只会发生在 TFS 中?我的猜测是应用 shelvetset 的时候有问题,和我的代码无关,但是我无法证明。

我在应用搁置集后比较了代码,仍然在那个版本中 CMakeLists.txt 没有提到 myHeader.h

或者,有一些关于在 CMakeLists.txt 文件中包含标题的规则,我不知道。

【问题讨论】:

CMake 不会抱怨 CMakeLists.txt 中未注明的文件。当 CMake 报告错误时,您已经注意到文件 somewhere.可能是您的 TFS 服务器以某种方式配置,因此它需要一些来自旧版本的 CMakeLists.txt。可能还有很多其他原因。您可以更仔细地检查日志并尝试找到该“幽灵”标头的来源。您可以尝试对项目进行许多修改,并检查哪些修改会导致错误,哪些不会。是的,有些东西很难调试。但是 Stack Overflow 并不能帮助你。 顺便说一句,对于文件/home/user/whatever/myproject/_include/myHeader.h,你写的是Indeed, that file is not there.。但在下面,您注意到一个文件 /myproject/_include/myHeader.h 属于您的文件结构。那么,你有没有这个文件?当错误很难找到时,不精确的事实是不好的。 它抱怨文件不在源目录中,而文件实际上在包含其他接口的_include目录中。我在问题中犯了一个错误对不起。刚刚修好了。 “它抱怨文件不在源目录中” - 不,这不是 CMake 抱怨的原因。有了这样的错误消息,CMake 通常会抱怨文件显式传递给add_executableadd_library,而这些文件在磁盘上不存在。参见例如该问题中的错误消息:***.com/questions/58533026/…。顺便说一句,正如您从该问题中看到的那样,错误消息比您显示的要详细得多 整个项目中没有那个文件的CMakeLists.txt,大概有50G大。该文件尚未传递给 add_library 或 add_executable。是的,它是在添加库时。这有帮助吗?我更新了这个问题以防万一。顺便说一句,这个问题与我的问题无关。 【参考方案1】:

因此,在进行了太多调试之后,我联系了负责构建过程的团队。事实证明,TFS 构建定义中的构建过程绝对不是我所期望的。当然,这并没有记录在案。

我们的开发主要是在 Windows 中(到目前为止)。 linux 构建在构建之前有一个步骤:启动一个脚本,该脚本解析每个 Visual Studio 项目文件,获取包含的文件,并将 CMakeLists.txt 文件中的源文件替换为从 VS 解析的源文件。对与错,就是这样。

我可以在本地机器上构建 linux 版本,因为一切都已正确完成。 Windows 构建也可以工作,即使 VS 项目文件有时包含一些不在源目录中但在某些仅头目录中的文件,并且以某种方式编译。我猜是因为目录是在包含目录中定义的。但是当 CMakeLists.txt 文件被更新时,cmake 抱怨(正确地)找不到文件。

因此,如果有人遇到类似问题,请联系您的 devops 团队或负责此类事情的人员。

【讨论】:

以上是关于CMake 找不到源文件,但在 TFS 构建定义中的 CMakeLists.txt 中未指定文件的主要内容,如果未能解决你的问题,请参考以下文章

TFS 构建服务器无法使发布配置文件工作:“找不到有效的 AspnetCompilerPath”

在单元测试用例的 TFS 构建中找不到路径的一部分

CMake 找不到 GLEW

CMake构建NDK项目提示asm/types.h找不到

CMake 错误:包含找不到加载文件:目标

TFS 2015 发布管理 - 工件类型:文件共享错误:System.IO.FileNotFoundException:找不到指定的文件