ふるお〜と!- FullAuto

AI・ロボットが普及しBI(ベーシックインカム)が早急に実現されることを願う元ニートのブログ

ふるお〜と!-FullAuto

CMakeがGenerateするファイル CMakeと属性構文の合わせ技

ignition gazeboのソースを見るといくつかのファイル(ほぼ全て?)に

#include "ignition/gazebo/Export.hh"

というようにExport.hhがインクルードされている。
このExport.hhというファイルはビルド前には存在しない。
Export.hh.inという形で存在している(./ign-cmake/cmake/Export.hh.in)。

#ifndef @export_base@_EXPORT_HH_
#define @export_base@_EXPORT_HH_

//detail/Export.hhヘッダーはCMakeによって自動的に生成されます。CMakeはこれらのマクロのシステム依存の実装のみを提供し、コメントや説明はありません。そのため、自動生成されたマクロを活用するが提供するこの公開ヘッダーを構成します。 
#include "@include_dir@/detail/Export.hh"


#ifndef @export_base@_VISIBLE
/// @ lib_name @開発者の場合:このマクロを@ lib_name @関数およびクラスに適用します。これらの関数およびクラスは、このライブラリのコンシューマーが独自のプログラムまたはライブラリから呼び出すことができる必要があります。
#define @export_base@_VISIBLE \
  DETAIL_@export_base@_VISIBLE
#endif


#ifndef @export_base@_HIDDEN
/// @ lib_name @開発者の場合:このマクロを、このライブラリのコンシューマーが使用してはならない@ lib_name @関数およびクラスに適用します。 デフォルトでは、このプロパティは@ export_base @ _VISIBLEでタグ付けされていないすべてのクラスと関数に適用されるため、通常はこれを使用する必要はありません。
#define @export_base@_HIDDEN \
  DETAIL_@export_base@_HIDDEN
#endif


#ifndef IGN_DEPRECATED
/// @ lib_name @開発者の場合:このマクロを使用して、関数またはクラスが非推奨になり、使用しないことを示します。 関数が非推奨になった時期についてユーザーにコンテキストを提供するために、バージョンを指定する必要があります。 
#define IGN_DEPRECATED(version) IGN_DEPRECATED_ALL_VERSIONS
#endif

#endif

Export.hhはさらにdetail/Export.hhを参照することになる。
要は
ClassのVisibilityの定義を行っている。
条件が揃えば下記の3つの属性構文がクラスに付加される。

// VISIBLE
__attribute__((visibility("default"))
// HIDDEN
__attribute__((visibility("hidden"))
// DEPRECATED
__attribute__ ((__deprecated__))



さぁ、みんなわかったかな?これから新たな大規模ソフトウェアプロジェクトをLaunchするときは属性構文を使いこなそう!!

それ以前のレベルの問題で苦戦しております

似たような知見

c++ - [[非推奨]] + __attribute__((visibility(“ default”)))in GCC 6.2 - ITツールウェブ