GenerateExportHeader¶
用於產生函式庫匯出巨集的函式
此模組提供了函式 GENERATE_EXPORT_HEADER()
。
版本 3.12 新增: 新增了對 C 專案的支援。先前的版本僅支援 C++ 專案。
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_PRESET
和 VISIBILITY_INLINES_HIDDEN
可用於為目標加入適當的編譯標誌。請參閱這些目標屬性的文件,以及方便變數 CMAKE_CXX_VISIBILITY_PRESET
和 CMAKE_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_EXPORT
、SOMELIB_NO_EXPORT
、SOMELIB_DEPRECATED
、SOMELIB_DEPRECATED_EXPORT
和 SOMELIB_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_EXPORT
、OTHER_NAME_NO_EXPORT
和 OTHER_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( [<output_variable>] )
版本 3.0 已棄用: 請改為設定目標屬性 CXX_VISIBILITY_PRESET
和 VISIBILITY_INLINES_HIDDEN
。
ADD_COMPILER_EXPORT_FLAGS
函式會將 -fvisibility=hidden
新增至 CMAKE_CXX_FLAGS
(如果支援),並且在 Windows 上為無操作,因為 Windows 不需要額外的編譯器標誌來支援匯出。您可以選擇將單一引數傳遞給 ADD_COMPILER_EXPORT_FLAGS
,該引數將填入啟用使用中編譯器/架構可見性支援所需的 CXX_FLAGS
。