0

我正在尝试在一个相对复杂的项目中编写一些 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将是理想的,但即使有一种简单的方法来模拟一个名称空间以供导入的函数进入,这也总比没有好。

4

1 回答 1

2

在 CMake 中,宏和函数具有全局可见性,没有什么可以改变它。

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

如果包含一个模块只有直接的效果,即定义了自定义命令/目标,但不为外部代码导出函数/宏/变量,您可以考虑将其与外部项目( ExternalProject_Add) 一起包装。外部项目是一个单独的 CMake 项目,它的 CMake 内容(如变量或函数)在其外部均不可见。

于 2020-03-10T22:26:34.237 回答