Warm tip: This article is reproduced from serverfault.com, please click

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

(linux - CMake cannot find source file, but file was not specified in CMakeLists.txt, in TFS build definition)

发布于 2020-12-11 15:50:32

我正在将一个大型项目移植到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抱怨该文件不在sources目录中,这是事实,因为它在另一个目录中。但是事实是我也没有要求!我的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文件中包含标头的规则。

Questioner
cauchy
Viewed
11
cauchy 2020-12-17 05:48:31

因此,在花费过多的调试时间后,我联系了负责构建过程的团队。事实证明,TFS构建定义中的构建过程绝对不是我期望的。当然,这没有记录。

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

我可以在本地计算机上构建linux构建,因为一切都正确完成了。即使VS项目文件有时包括一些不在源目录中但在某些仅标头目录中的文件,并且以某种方式进行了编译,Windows构建也起作用。我猜是因为该目录是在include目录中定义的。但是,当更新CMakeLists.txt文件时,cmake抱怨(正确地如此)抱怨找不到文件。

因此,如果有人遇到类似问题,请与你的开发团队或负责此类事情的任何人联系。