https://qa.1r1g.com/sf/ask/3723663051/

 

 

CMAKE_SOURCE_DIR是cmake最初被调用的位置,CMAKE_CURRENT_SOURCE_DIR也是cmake当前正在工作的位置。例如,如果使用add_subdirectory命令将依赖项包含到项目中,则依赖项将具有自己的依赖项,CMAKE_CURRENT_SOURCE_DIRCMAKE_SOURCE_DIR将保持不变。

展开一些程序员花花公子的评论,想象一下您在项目的不同目录中具有以下三个CMakeFiles

CMakeLists.txt

cmake_minimum_required(VERSION 3.12)

message("root dir CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")
message("root dir CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")

add_subdirectory(sub1)
add_subdirectory(sub2)

Run Code Online (Sandbox Code Playgroud)

sub1 / CMakeLists.txt

message("sub1 dir CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")
message("sub1 dir CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")

Run Code Online (Sandbox Code Playgroud)

sub2 / CMakeLists.txt

message("sub2 dir CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")
message("sub2 dir CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")

Run Code Online (Sandbox Code Playgroud)

cmake .目录上运行会给我这个输出

root dir CMAKE_SOURCE_DIR = /Users/henrique/cmake_tests
root dir CMAKE_CURRENT_SOURCE_DIR = /Users/henrique/cmake_tests
sub1 dir CMAKE_SOURCE_DIR = /Users/henrique/cmake_tests
sub1 dir CMAKE_CURRENT_SOURCE_DIR = /Users/henrique/cmake_tests/sub1
sub2 dir CMAKE_SOURCE_DIR = /Users/henrique/cmake_tests
sub2 dir CMAKE_CURRENT_SOURCE_DIR = /Users/henrique/cmake_tests/sub2

Run Code Online (Sandbox Code Playgroud)

现在,如果我cmake .sub1目录上运行,则两个变量的值相同:

sub1 dir CMAKE_SOURCE_DIR = /Users/henrique/cmake_tests/sub1
sub1 dir CMAKE_CURRENT_SOURCE_DIR = /Users/henrique/cmake_tests/sub1

Run Code Online (Sandbox Code Playgroud)