Cmake中的PUBLIC,PRIVATE,INTERFACE
目录
- 在 CMake 中,
PUBLIC
、PRIVATE
和INTERFACE
关键字用于指定目标属性的可见性。这些关键字通常与target_link_libraries()
、target_include_directories()
、target_compile_definitions()
和target_compile_options()
等函数一起使用。
-
PUBLIC
:当使用PUBLIC
关键字时,指定的属性将应用于当前目标以及链接到该目标的其他目标。换句话说,这些属性将成为当前目标的属性,同时也会传递给其他目标。例如:
1
target_link_libraries(my_library PUBLIC another_library)
这将使得
another_library
成为my_library
的依赖,并且任何链接到my_library
的目标也将链接到another_library
。 -
PRIVATE
:当使用PRIVATE
关键字时,指定的属性仅应用于当前目标,而不会传递给其他目标。例如:
1
target_include_directories(my_library PRIVATE include/)
这将使得
include/
目录成为my_library
的私有包含目录,但不会传递给链接到my_library
的其他目标。 -
INTERFACE
:当使用INTERFACE
关键字时,指定的属性仅应用于链接到当前目标的其他目标,而不会应用于当前目标本身。例如:
1
target_compile_definitions(my_library INTERFACE MY_LIB_DEFINE)
这将使得
MY_LIB_DEFINE
宏定义仅对链接到my_library
的其他目标可见,而不会应用于my_library
本身。
在使用这些关键字时,请根据属性是否需要传递给其他目标来选择合适的可见性。一般来说,库的公共头文件和依赖应使用 PUBLIC
,私有头文件和编译选项应使用 PRIVATE
,仅需要传递给其他目标的属性应使用 INTERFACE
。