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
如何确定CMake函数的范围,使其能够';不能从文件外部访问?_Cmake_Scope_Cmake Modules - Fatal编程技术网

如何确定CMake函数的范围,使其能够';不能从文件外部访问?

如何确定CMake函数的范围,使其能够';不能从文件外部访问?,cmake,scope,cmake-modules,Cmake,Scope,Cmake Modules,我试图在一个相对复杂的项目中编写一些CMake代码,我有一个模块,内部包含另一个模块。问题是,每当我包含我的模块时,它内部包含的模块中定义的所有函数都在全局级别可用!这实际上是在用一堆我没有明确要求的函数来污染我的全局名称空间 例如: # CMakeLists.txt # Include my module include(MyModule) # Call a function from my module my_module_function() # HERE IS THE PROBLE

我试图在一个相对复杂的项目中编写一些CMake代码,我有一个模块,内部包含另一个模块。问题是,每当我包含我的模块时,它内部包含的模块中定义的所有函数都在全局级别可用!这实际上是在用一堆我没有明确要求的函数来污染我的全局名称空间

例如:

# CMakeLists.txt

# Include my module
include(MyModule)

# Call a function from my module
my_module_function()

# HERE IS THE PROBLEM -- functions from "AnotherModule" are visible here!
# This call works
another_module_function()
在我的模块内:

# MyModule.cmake

# Include another module
#  - This other module is written and supported by someone else so I can't modify it
#  - No functions from "AnotherModule" will be used outside of "MyModule"
include(AnotherModule)

# Define my function
function(my_module_function)

    # Call a function from the other module
    another_module_function()
endfunction()
MyModule.cmake
内部是否有任何方法可以从
AnotherModule.cmake
导入函数,而不让它们在我自己的模块外部可见?另一个模块是由其他人编写的,因此我无法控制它,它包含其他具有非常通用名称的函数,如名为
parse_arguments
的函数,这可能会在以后导致命名冲突


使
AnotherModule.cmake
中的函数在
MyModule.cmake
之外完全不可见是理想的,但是,即使有一种简单的方法来模拟导入函数的名称空间,也总比没有好。

在CMake中,宏和函数具有全局可见性,没有任何东西可以改变这一点

通常,某个模块的“内部”函数是用下划线(
\uu
)前缀定义的。这样的前缀起到了向外部代码“不要使用我”发出信号的作用。但这只是一个约定,CMake不强制任何关于下划线前缀名称的内容


如果包含一个模块只有<强>立即效果,即定义自定义命令/目标,但不输出函数/宏/变量用于外部代码,则可以考虑用<强>外部项目(<代码>外部ProjutsAdv>代码>)包装它。外部项目是一个单独的CMake项目,其CMake对象(如变量或函数)在外部都不可见。

在CMake中,宏和函数具有全局可见性,没有任何东西可以改变这一点

通常,某个模块的“内部”函数是用下划线(
\uu
)前缀定义的。这样的前缀起到了向外部代码“不要使用我”发出信号的作用。但这只是一个约定,CMake不强制任何关于下划线前缀名称的内容


如果包含一个模块只有<强>立即效果,即定义自定义命令/目标,但不输出函数/宏/变量用于外部代码,则可以考虑用<强>外部项目(<代码>外部ProjutsAdv>代码>)包装它。一个外部项目是一个单独的CMake项目,它的CMake对象(如变量或函数)在外部都不可见。

我认为
ExternalProject\u Add
在这种情况下不起作用,因为模块本身根本不是真正的项目。它们只是在一定范围内提供了一些我需要的功能,然后我不再关心这些功能,也不希望它们渗透到我项目的其余部分。对于我自己的模块,我采用了一种命名约定,在这种约定中,我用一种“名称空间”作为函数的前缀,但是如果模块来自其他人,并且我不能更改每个函数的名称,那么这就不起作用了。我可能必须向模块作者提交一个bug,以获取我包含的其中一个模块,因为大多数函数的命名都是合理的,不会与我自己的函数发生冲突,但它也定义了一个名为
parse_arguments
的宏,它肯定会与其他东西发生名称冲突。我认为
ExternalProject_Add
在这种情况下不起作用,因为模块本身根本不是真正的项目。它们只是在一定范围内提供了一些我需要的功能,然后我不再关心这些功能,也不希望它们渗透到我项目的其余部分。对于我自己的模块,我采用了一种命名约定,在这种约定中,我用一种“名称空间”作为函数的前缀,但是如果模块来自其他人,并且我不能更改每个函数的名称,那么这就不起作用了。我可能必须向模块作者提交一个bug,以获取我包含的其中一个模块,因为大多数函数的命名都是合理的,不会与我自己的函数发生冲突,但它还定义了一个名为
parse_arguments
的宏,该宏肯定会与其他名称发生冲突。