目录

Cmake中的PUBLIC,PRIVATE,INTERFACE

目录
  • 在 CMake 中,PUBLICPRIVATEINTERFACE 关键字用于指定目标属性的可见性。这些关键字通常与 target_link_libraries()target_include_directories()target_compile_definitions()target_compile_options() 等函数一起使用。
  1. PUBLIC:当使用 PUBLIC 关键字时,指定的属性将应用于当前目标以及链接到该目标的其他目标。换句话说,这些属性将成为当前目标的属性,同时也会传递给其他目标。

    例如:

    1
    
    target_link_libraries(my_library PUBLIC another_library)
    

    这将使得 another_library 成为 my_library 的依赖,并且任何链接到 my_library 的目标也将链接到 another_library

  2. PRIVATE:当使用 PRIVATE 关键字时,指定的属性仅应用于当前目标,而不会传递给其他目标。

    例如:

    1
    
    target_include_directories(my_library PRIVATE include/)
    

    这将使得 include/ 目录成为 my_library 的私有包含目录,但不会传递给链接到 my_library 的其他目标。

  3. INTERFACE:当使用 INTERFACE 关键字时,指定的属性仅应用于链接到当前目标的其他目标,而不会应用于当前目标本身。

    例如:

    1
    
    target_compile_definitions(my_library INTERFACE MY_LIB_DEFINE)
    

    这将使得 MY_LIB_DEFINE 宏定义仅对链接到 my_library 的其他目标可见,而不会应用于 my_library 本身。

在使用这些关键字时,请根据属性是否需要传递给其他目标来选择合适的可见性。一般来说,库的公共头文件和依赖应使用 PUBLIC,私有头文件和编译选项应使用 PRIVATE,仅需要传递给其他目标的属性应使用 INTERFACE