Cake中的CMAKE_SOURCE_DIR和PROJECT_SOURCE_DIR是一样的吗?

fee*_*ree 42 cmake

此页面包含CMake已为我们定义的变量的完整摘要.我觉得有些变数是一样的.采取的例子CMAKE_SOURCE_DIRPROJECT_SOURCE_DIR为例.它们是相同的,指的是定义顶级CMakeLists.txt的文件夹.所以我的问题是:它们之间有细微差别吗?谢谢.

Fra*_*ser 74

还有就是这些变量之间的差异. CMAKE_SOURCE_DIR确实是指定义顶级CMakeLists.txt的文件夹.但是,PROJECT_SOURCE_DIR指的是包含最新project()命令的CMakeLists.txt的文件夹.

例如,假设您有一个调用的顶级项目Outer,它包含一个子目录,其中有一个名为的项目Inner. Outer的CMakeLists.txt有:

project(Outer)
add_subdirectory(Inner)
Run Code Online (Sandbox Code Playgroud)

并且Inner是:

project(Inner)
Run Code Online (Sandbox Code Playgroud)

然后在这两个CMakeLists文件中,CMAKE_SOURCE_DIR将引用Outer的源目录.不过,虽然PROJECT_SOURCE_DIR对于Outer也在此同一目录,这是不适合的情况Inner. InnerPROJECT_SOURCE_DIR是含有其的CMakeLists.txt子目录.

这种差异适用于所有PROJECT_<var>vs CMAKE_<var>变量.

  • 你能用`CMAKE_CURRENT_SOURCE_DIR`添加区别吗? (8认同)
  • 有必要**强调**,“PROJECT_SOURCE_DIR”需要调用“project(aaa)”才能使“PROJECT_SOURCE_DIR”具有值。 (2认同)

Iza*_*ana 9

按照弗雷泽的出色回答。

CMAKE_CURRENT_SOURCE_DIRthe build directory being processed.

假设您有一个名为的目录,Inner1其中包含一个 CMakeLists.txt 文件,但没有在其中调用project。thenPROJECT_SOURCE_DIR不是用Inner1的 dir 路径CMAKE_CURRENT_SOURCE_DIR设置的,而是在处理时设置的。

您可能还会发现CMAKE_CURRENT_LIST_DIR很有趣,并且列表文件的定义很有用。