如何在CMake子目录中访问add_subdirectory引入的外部项目变量?
解决方法
要在Project B的Subdirectory_B目录下访问Project_A中定义的var_projectA变量,核心是让该变量突破原目录作用域,传递到上层及后续子目录中,有两种常用方案:
方案一:修改Project_A的CMakeLists,将变量传递到父作用域
直接在Project_A的CMakeLists_A.txt里修改set命令,添加PARENT_SCOPE参数,这样变量会被传递到调用add_subdirectory的父目录(也就是Project B的根目录),之后Project B的所有子目录(包括Subdirectory_B)就能直接访问这个变量:
# Project_A/CMakeLists_A.txt set(var_projectA ${CMAKE_CURRENT_SOURCE_DIR}/foo.H PARENT_SCOPE)
之后在Subdirectory_B/CMakeLists_subB.txt里直接使用${var_projectA}即可,比如:
# Subdirectory_B/CMakeLists_subB.txt message("Path to foo.H: ${var_projectA}")
方案二:将变量设为全局缓存变量
如果不想修改Project_A的配置,可以在Project B根目录的CMakeLists_B.txt里,把从Project_A获取的变量重新设置为全局缓存变量:
# Project_B/CMakeLists_B.txt add_subdirectory(${CMAKE_SOURCE_DIR}/extern/Project_A) # 将变量设为内部缓存变量,全局可见 set(var_projectA ${var_projectA} CACHE INTERNAL "Path to Project_A's foo.H")
之后同样可以在Subdirectory_B/CMakeLists_subB.txt里直接使用${var_projectA}。
内容的提问来源于stack exchange,提问作者Rob S
相关产品推荐
相关产品推荐

