GenerateExportHeader

此模組提供 generate_export_header() 函數,用於為函式庫產生匯出巨集。

版本 3.12 新增: 新增對 C 專案的支援。先前的版本僅支援 C++ 專案。

generate_export_header

generate_export_header() 函數可用於產生適用於前處理器包含的檔案,其中包含用於函式庫類別的 EXPORT 巨集

generate_export_header(LIBRARY_TARGET
         [BASE_NAME <base_name>]
         [EXPORT_MACRO_NAME <export_macro_name>]
         [EXPORT_FILE_NAME <export_file_name>]
         [DEPRECATED_MACRO_NAME <deprecated_macro_name>]
         [NO_EXPORT_MACRO_NAME <no_export_macro_name>]
         [INCLUDE_GUARD_NAME <include_guard_name>]
         [STATIC_DEFINE <static_define>]
         [NO_DEPRECATED_MACRO_NAME <no_deprecated_macro_name>]
         [DEFINE_NO_DEPRECATED]
         [PREFIX_NAME <prefix_name>]
         [CUSTOM_CONTENT_FROM_VARIABLE <variable>]
)

目標屬性 CXX_VISIBILITY_PRESETVISIBILITY_INLINES_HIDDEN 可用於為目標新增適當的編譯旗標。請參閱這些目標屬性的文件,以及便利變數 CMAKE_CXX_VISIBILITY_PRESETCMAKE_VISIBILITY_INLINES_HIDDEN

預設情況下,generate_export_header() 會在由函式庫名稱決定的檔名中產生巨集名稱。這表示在最簡單的情況下,GenerateExportHeader 的使用者將等同於

set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
add_library(somelib someclass.cpp)
generate_export_header(somelib)
install(TARGETS somelib DESTINATION ${LIBRARY_INSTALL_DIR})
install(FILES
 someclass.h
 ${PROJECT_BINARY_DIR}/somelib_export.h DESTINATION ${INCLUDE_INSTALL_DIR}
)

而在 ABI 標頭檔中

#include "somelib_export.h"
class SOMELIB_EXPORT SomeClass {
  ...
};

CMake 片段將在 ${CMAKE_CURRENT_BINARY_DIR} 中產生一個名為 somelib_export.h 的檔案,其中包含巨集 SOMELIB_EXPORTSOMELIB_NO_EXPORTSOMELIB_DEPRECATEDSOMELIB_DEPRECATED_EXPORTSOMELIB_DEPRECATED_NO_EXPORT。它們後面將會跟隨從 CUSTOM_CONTENT_FROM_VARIABLE 選項指定的變數中取得的內容 (如果有的話)。產生的檔案應該與函式庫中的其他標頭一起安裝。

BASE_NAME 引數可用於覆寫檔名和用於巨集的名稱

add_library(somelib someclass.cpp)
generate_export_header(somelib
  BASE_NAME other_name
)

產生一個名為 other_name_export.h 的檔案,其中包含巨集 OTHER_NAME_EXPORTOTHER_NAME_NO_EXPORTOTHER_NAME_DEPRECATED 等。

BASE_NAME 可以透過在函數中指定其他選項來覆寫。例如

add_library(somelib someclass.cpp)
generate_export_header(somelib
  EXPORT_MACRO_NAME OTHER_NAME_EXPORT
)

建立巨集 OTHER_NAME_EXPORT 而不是 SOMELIB_EXPORT,但其他巨集和產生的檔名與預設值相同

add_library(somelib someclass.cpp)
generate_export_header(somelib
  DEPRECATED_MACRO_NAME KDE_DEPRECATED
)

建立巨集 KDE_DEPRECATED 而不是 SOMELIB_DEPRECATED

如果 LIBRARY_TARGET 是靜態函式庫,則巨集會在沒有值的情況下定義。

如果相同的原始碼用於建立共用和靜態函式庫,則在建置靜態函式庫時,應使用大寫符號 ${BASE_NAME}_STATIC_DEFINE

add_library(shared_variant SHARED ${lib_SRCS})
add_library(static_variant ${lib_SRCS})
generate_export_header(shared_variant BASE_NAME libshared_and_static)
set_target_properties(static_variant PROPERTIES
  COMPILE_FLAGS -DLIBSHARED_AND_STATIC_STATIC_DEFINE)

這將導致匯出巨集在建置靜態函式庫時展開為空。

如果指定了 DEFINE_NO_DEPRECATED,則將定義巨集 ${BASE_NAME}_NO_DEPRECATED。此巨集可用於從前處理器輸出中移除已棄用的程式碼

option(EXCLUDE_DEPRECATED "Exclude deprecated parts of the library" FALSE)
if (EXCLUDE_DEPRECATED)
  set(NO_BUILD_DEPRECATED DEFINE_NO_DEPRECATED)
endif()
generate_export_header(somelib ${NO_BUILD_DEPRECATED})

然後在 somelib 中

class SOMELIB_EXPORT SomeClass
{
public:
#ifndef SOMELIB_NO_DEPRECATED
  SOMELIB_DEPRECATED void oldMethod();
#endif
};
#ifndef SOMELIB_NO_DEPRECATED
void SomeClass::oldMethod() {  }
#endif

如果指定了 PREFIX_NAME,則此引數將用作所有產生巨集的前綴。

例如

generate_export_header(somelib PREFIX_NAME VTK_)

產生巨集 VTK_SOMELIB_EXPORT 等。

版本 3.1 新增: 函式庫目標可以是 OBJECT 函式庫。

版本 3.7 新增: 新增 CUSTOM_CONTENT_FROM_VARIABLE 選項。

版本 3.11 新增: 新增 INCLUDE_GUARD_NAME 選項。

add_compiler_export_flags
add_compiler_export_flags([<output_variable>])

版本 3.0 已棄用: 請改為設定目標屬性 CXX_VISIBILITY_PRESETVISIBILITY_INLINES_HIDDEN

add_compiler_export_flags() 函數會將 -fvisibility=hidden 新增到 CMAKE_CXX_FLAGS (如果支援),並且在 Windows 上為 no-op,Windows 不需要額外的編譯器旗標來支援匯出。您可以選擇性地傳遞單一引數給 add_compiler_export_flags(),該引數將會填入啟用使用中編譯器/架構的可見性支援所需的 CXX_FLAGS