Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在CMake中重用代码_Linux_Cmake_Code Reuse_Reusability - Fatal编程技术网

Linux 如何在CMake中重用代码

Linux 如何在CMake中重用代码,linux,cmake,code-reuse,reusability,Linux,Cmake,Code Reuse,Reusability,我有以下代码,它获取当前系统IP并将其存储在服务器IP变量中: EXECUTE_PROCESS( COMMAND ip route get 8.8.8.8 COMMAND awk "NR==1 {print $NF}" OUTPUT_VARIABLE SERVER_IP OUTPUT_STRIP_TRAILING_WHITESPACE ) 我需要在我的CMakeLists.txt文件层次结构中的多个位置使用此IP。重用此代码的最佳方法是什么?我的第一个想法是使它

我有以下代码,它获取当前系统IP并将其存储在
服务器IP
变量中:

EXECUTE_PROCESS(
    COMMAND ip route get 8.8.8.8
    COMMAND awk "NR==1 {print $NF}"
    OUTPUT_VARIABLE SERVER_IP
    OUTPUT_STRIP_TRAILING_WHITESPACE
)

我需要在我的
CMakeLists.txt
文件层次结构中的多个位置使用此IP。重用此代码的最佳方法是什么?我的第一个想法是使它成为一个类似于
函数(GetIP)
的函数,但我不确定将此函数放在何处以使其对所有CMakeLists.txt文件可见。

如果您在顶级
CMakeLists.txt
文件中提供CMake函数,它也将在您使用
ADD_子目录
添加的子目录的
CMakeLists.txt
文件中提供


要么直接在顶级
CMakeLists.txt
文件中定义函数,要么在那里使用类似于
INCLUDE(GetIP.cmake)
的内容。

如果只是关于IP本身,只需将其放入变量中即可

目录中设置的变量由所有子目录继承,但不由父目录继承。您可以使用的
PARENT\u scope
参数将局部变量的范围扩展一级

或者,将变量放入缓存中,使其全局可访问。除非标记为内部,否则这也将使变量可通过CMake GUI进行配置

 set(MY_SERVER_IP 8.8.8.8 CACHE STRING "IP address of the server responsible for X")

 [...]
 EXECUTE_PROCESS(
     COMMAND ip route get ${MY_SERVER_IP}
     COMMAND awk "NR==1 {print $NF}"
     OUTPUT_VARIABLE SERVER_IP
     OUTPUT_STRIP_TRAILING_WHITESPACE
 )

你想重用函数的结果还是能够从其他地方调用它?@ypx我认为重用它的结果就足够了。在这种情况下,ComicSansMS使用PARENT_作用域的答案更相关。我建议在问题中说清楚,也许我做错了什么,但是在根CMakeLists.txt文件中定义的缓存变量在层次结构中的另一个CMakeLists.txt文件中包含的*.cmake文件中是未知的。@Meysam注意,同名的局部变量在封闭范围中隐藏变量。除此之外,没有什么可以阻止您看到缓存变量。还请确保变量在缓存中确实具有预期值-除了少数特殊情况外,CMake不会覆盖缓存中已设置的变量,除非您使用
FORCE
。此答案没有错,它是重用CMake代码的写入解决方案。然而,事实证明Meysam正在寻找从多个位置访问同一变量的方法,这是在变量范围的方向上。