如何在不同的CMake文件之间共享变量

问题描述 投票:0回答:3

如何在不同的 CMake 文件之间共享变量,我将展示以下示例来说明我的问题:

主要

cmake_minimum_required(VERSION 2.6)
project(test)
set(Var3 "Global variable")

add_subdirectory(${test_SOURCE_DIR}/exe)
add_subdirectory(${test_SOURCE_DIR}/dll)

EXE文件

set(Var1 "this is variable 1")
set(Var1 ${Var1} " added to varible 1")
message(STATUS ${Var1})

DLL文件

set(Var2 "this is variable 2")
message(STATUS ${Var2})
message(STATUS ${Var1})
message(STATUS ${Var3})

在此示例中,Var3 可以在

exe
dll
的 CMake 文件中看到,因为它在
Main
中定义。但是,在
exe
中定义的 Var1 在
dll
中不会被观察到。我只是好奇:有没有办法让
exe
中定义的 Var1 在
dll
中可观察到?

cmake
3个回答
33
投票

除了 Tadeusz 正确所说的之外,您可以使用以下方法使变量在任何级别(不仅仅是一级!)可见:

set(Var1 "This is variable 1" CACHE INTERNAL "")

该变量将可用于该指令之后的所有 CMake 指令,因此,例如,它不可用于在定义此变量的目录之前添加的姊妹目录。


19
投票
变量可见范围形成一棵树。使用

add_subdirectory

 添加的 CMakeFiles.txt 文件可以访问其自身以及父作用域(示例中的顶级全局作用域)中定义的变量。

您可以使用以下方法导出上一级变量:

set(Var1 "This is variable 1" PARENT_SCOPE)
    

0
投票
在我的例子中,我在变量上应用了

list(TRANSFORM)

,这些修改没有反映在全局范围内 - 显然 
list
 命令仅就地修改局部变量,而不是全局变量 - 我使用了中间变量作为解决方法:

set(MOC_HEADERS application.hxx command.hxx menubar.hxx uiloader.hxx ) list(TRANSFORM MOC_HEADERS PREPEND "${CMAKE_CURRENT_LIST_DIR}/") set(EASYQT_MOC_HEADERS ${MOC_HEADERS} CACHE INTERNAL "")
    
© www.soinside.com 2019 - 2024. All rights reserved.