2017-01-27 5 views
1

グローバルスコープで実行したいコードがあります。だから、私はこのようなコンパイル単位でグローバル変数を使用することができます。グローバルスコープでコードを実行するための標準的な方法はありますか?

int execute_global_code(); 
namespace { 
int dummy = execute_global_code(); 
} 

事は、このコンパイル単位は、静的ライブラリ(または-fvisibility=hiddenと共有1)で終わる場合、リンカはに決めることができるということですdummyを使用しないで削除し、グローバルコードを実行してください。

特定のコンパイラ(プラグマのインクルード)、コンパイルユニットの場所(属性の可視性の既定値)、周囲のコード(具体的には、dummyのコードを自分のコードに入れて使用することができます。 )。

質問は、execute_global_codeは関係なく、コンパイル単位の配置(実行ファイルまたはLIB)の動作する1つのマクロに収まるように実行されることを確認するための標準的な方法はありますか?つまり、標準的なC++のみであり、そのマクロの外側にユーザ​​コードはありません(dummymain()のような)

+1

関連する? http://stackoverflow.com/a/11336506/5265292 – grek40

+0

あなたの説明では、問題に対するさまざまな解決策の可能性を排除しました。なぜあなたは 'dummy'を初期化するコードが一つのマクロに収まる必要があると主張していますか? – Peter

+0

@Peterそうでなければ、 "メインのダミー"のダミー使用が解決策になるからです。重要な点は、明示的な初期化コードでライブラリユーザーに負担をかけたくないということです。 –

答えて

1

リンカは、与えられたバイナリを直接リンクするためにすべてのオブジェクトファイルを使用しますが、静的ライブラリは、現在定義されていないシンボルを定義するオブジェクトファイルのみをプルします。

つまり、静的ライブラリ内のすべてのオブジェクトファイルにこのような自己登録コード(またはリンクされているバイナリから参照されていない他のコード)のみが含まれている場合、静的ライブラリ全体からは何も使用されません。

これはすべての最新のコンパイラに当てはまります。プラットフォームに依存しないソリューションはありません。

CMakeを使用してソースコードを回避する非侵入型の方法は、hereです。here - プリコンパイル済みのヘッダーが使用されていないと動作します。使用例:

doctest_force_link_static_lib_in_target(exe_name lib_name) 

grek40コメントですでにpointed outを持っているとしてこれを行うには、いくつかのコンパイラ固有の方法があります。

関連する問題