none
DLL 実装変更に伴う、参照プロジェクトの再リンクを防ぎたい RRS feed

  • 質問

  • DLL の内部コード変更で、参照プログラムの再リンクを防ぐ方法がないか知りたいです

    例えば以下のようなシナリオを想定しています

    DLLプロジェクト

    __declspec(__dllexport) int calc(int a, int b)
    {
        return (a + b);
    }

    参照プロジェクト

    __declspec(__dllimport) int calc(int a, int b);

    int main(int argc, char* argv[])
    {
        return calc(10, 20);
    }

    こうしたプロジェクトで、DLL 側の実装を、例えば return (a * b) に変更したとしても、
    実質、リンクインターフェースは変わらないはずなので、参照プロジェクト側では再リンク
    してほしくないのですが、実際にビルドすると再リンクが発生し、シグネチャが変わって
    しまいます

    こうした状況を回避、もしくは改善できるテクニックはないものでしょうか?

    2017年1月7日 8:55

回答

  • DLL側のプロジェクトの設定で、インクリメンタルリンクが無効になっている場合、リンクインターフェースが変わらない変更でもlibが更新され、参照側のプロジェクトも再リンクが発生するようです。

    DLLのプロジェクトのプロパティで、「構成プロパティ」→「リンカー」→「全般」→「インクリメンタル リンクを有効にする」が「いいえ」になっている場合、「はい」に変更してみてください。

    • 回答としてマーク ishizawa 2017年1月7日 12:57
    2017年1月7日 10:34

すべての返信

  • DLL側のプロジェクトの設定で、インクリメンタルリンクが無効になっている場合、リンクインターフェースが変わらない変更でもlibが更新され、参照側のプロジェクトも再リンクが発生するようです。

    DLLのプロジェクトのプロパティで、「構成プロパティ」→「リンカー」→「全般」→「インクリメンタル リンクを有効にする」が「いいえ」になっている場合、「はい」に変更してみてください。

    • 回答としてマーク ishizawa 2017年1月7日 12:57
    2017年1月7日 10:34
  • ありがとうございます

    確かにこれが解決策のようです

    ただし、通常のリリースビルドの際、以下のオプションもオフまたは未定義にする必要がありました

    ・プログラム全体の最適化 /LG

    ・リンク時のコード生成 /LTCG or /LTCG:incrementral

    ・参照 /OPT:REF

    ・COMDAT の圧縮 /OPT:ICF

    DLL が十分小さな実装内容であれば、最適化の恩恵よりも再リンクなしの恩恵の方がまさりそうですが、十分に複雑で大きい場合は、最適化の恩恵も無視できなくなりそうですね

    今後は、最適化が問題にならなさそうなプロジェクトにおいて、このテクニックを使っていこうと思います

    2017年1月7日 13:04