共有ライブラリのリビジョン1には、次のABIを維持するために必要な構造体があります。
struct Person
{
std::string first_name;
std::string last_name;
}
リビジョン2では、Personを次のように変更しています。
class Person
{
public:
Person(const std::string &f, const std::string &l);
std::string first_name;
std::string last_name;
}
ソースの互換性を維持するために、Personのバージョン1を変更して、新しいヘッダーファイルに対してコンパイルされたコードが実行され、再コンパイルされていないコードが実行されるようにします。
2つの新しい非インラインコンストラクターを使用して次のことを実行できますか?
class Person
{
public:
Person();
Person(const std::string &f, const std::string &l);
std::string first_name;
std::string last_name;
}
これはすべてg++で行っています。生成された共有ライブラリをnmで見ると、プレーン構造体のコンストラクタまたはデストラクタが表示されないため、再コンパイルされないコードは、以前と同じように呼び出し元のサイトでPersonを構築するだけだと思います。再コンパイルされるコードはすべて、引数なしのコンストラクターを使用します。
私が目にする唯一の問題は、コンストラクターを持たない古いバージョンの共有ライブラリにロールバックする必要がある場合、それに対してコンパイルされたコードはすべて壊れますが、この状況については心配していません。