1

Qt フレームワークQTextCodecを静的ライブラリに実装しています。コーデックの実装がQTextCodec::codecForMib(int)およびに登録されるようにするQTextCodec::codecForName(const char *)には、いくつかのことが必要です。

  • コーデックのインスタンスを初期化する必要があります (ただし、必ずしも使用する必要はありません)。
  • インスタンスを削除したり、範囲外にしたりしてはなりません。

これはQTextCodec::QTextCodec()、インスタンスが既知のコーデックの辞書に登録されているためと思われます。わかった。そのため、アプリケーション (静的ライブラリにリンクされている) にグローバル変数を追加すると、単体テストは成功します。

ただし、静的ライブラリにグローバル インスタンスを配置したいので、それに対してリンクするアプリは自分で面倒をみる必要はありません。しかし、アプリケーションがそれを参照せずに、クラスインスタンスを静的ライブラリで初期化する方法を理解できません

アプリケーションで参照しない限り、クラスのインスタンスを実際に初期化するQMyTextCodec xことも初期化することもありません。QMyTextCodec *x = new QMyTextCodecx

4

1 に答える 1

1

#pragmaステートメントを通じてオプションを MSVC リンカに渡し、 `/include'オプションを使用して強制的に変数をリンクさせることができます。

#pragma comment(linker, "/INCLUDE:variable_name")

/OPT:REF最適化フラグが使用されている場合、これはその変数の削除をオーバーライドします。ステートメントが機能するために#pragmaは、静的ライブラリにリンクするプロジェクトの少なくとも 1 つの翻訳単位 (ソース ファイル) に表示される必要があります。これは、プロジェクトによってインクルードされることが保証されているヘッダー ファイルに配置することで実現できます。#pragmaは名前の装飾を自動的に処理しないため、名前の装飾も考慮する必要があります。

Init.cpp

QMyTextCodec initvariable;

MainHeader.h

#pragma comment(linker, "/INCLUDE:?initvariable@@3VQMyTextCodec@@A")

次に、静的ライブラリに依存するプロジェクトで、単に含めるだけですMainHeader.h

ExternalProjectMain.cpp

#include "staticlib/MainHeader.h"
#include "something.h"
...
...

注: シンボル名が正しくない場合、未解決のリンカー エラーが発生します。

-

GCC のドキュメントによると、__attribute__キーワードを使用して同様の効果を実現できます。ただし、これをテストするのに便利な GCC インストールはありません。

QMyTextCodec initvariable __attribute__(externally_visible);
于 2013-04-17T05:47:12.960 に答える