【发布时间】: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_executable或add_library,而这些文件在磁盘上不存在。参见例如该问题中的错误消息:stackoverflow.com/questions/58533026/…。顺便说一句,正如您从该问题中看到的那样,错误消息比您显示的要详细得多。 -
整个项目中没有那个文件的CMakeLists.txt,大概有50G大。该文件尚未传递给 add_library 或 add_executable。是的,它是在添加库时。这有帮助吗?我更新了这个问题以防万一。顺便说一句,这个问题与我的问题无关。