2017-02-01 6 views
2

今日私はこのインタビューでこの質問をしました。残念ながら、ここで正しく再現しているかどうかはわかりません。私はそれをよく理解していないことを覚えています。質問は静的ライブラリと動的ライブラリの両方を同じ実行可能な原因にリンクするにはどのような問題がありますか?

だったかもしれない「静的および動的にコンパイルDLLをロードすることができますどのような問題 原因を?」

は、少なくとも2つの主要な問題があることを私は答えを知らなかったが、面接は私に言った:

  1. ランタイムライブラリ:いくつかの互換性の割り当てと割り当て解除が可能メモリの。

  2. 残念ながらここで私たちは中断してしまいましたが、この質問には戻りませんでした。

私は、この質問がどのようなものであったか、またその答えは何かを理解するのを助けてくれますか?

私も最初の点をよく理解していませんでした。プログラムにはmallocが1つしかないと思ったのですが、間違っていますか?

答えて

4

A.dllが標準ライブラリバージョン1.0と静的にリンクしているとします。そしてそれはこのようになります機能を持っています

char * f() { 
    return malloc(100); // uses malloc 1.0 
    } 

今すぐ標準ライブラリのバージョン1.1を使用して動的にA.DLLとし、静的にリンクする別のライブラリB.DLLがあると言うことができます。あなたは、おそらく動的に標準ライブラリ1.0で割り当てられたポインターを持っている(私はこれのどれもが標準化されていないため、「たぶん」と言う)

void g() { 
     char * p = f(); // returns the result of malloc 1.0 
     free(p); // uses free 1.1 
    } 

、それはバージョンで解放されました:それはこのようになります機能を持っています1.1。これはしばしば重大で困難な問題を診断することにつながります。

+0

ありがとうございました! "標準ライブラリ"とは、ランタイムライブラリを意味しますか、これが標準ライブラリに含まれていることを意味しますか? –

+1

CやC++の標準では、ランタイムライブラリについては何も言及していません。 mallocとfreeは両方の言語の標準ライブラリの一部です。 –

1

ランタイムの前に静的にコンパイルされたdllがコンパイルされるため、何か(関数など)を変更する必要がある場合は、.exeを再コンパイルする必要があります。静的にコンパイルされたdllも、動的にリンクされたdllよりも大きい。動的にリンクされたdllは実行時にリンクされているので、すべての関数はメモリ内に特別な場所を持っています(静的にコンパイルされたときなど)。お役に立てれば。

+1

静的または動的にコンパイルされたものはありません。また、.exeを再コンパイルする必要はありません。再リンクする必要があるかもしれません。 –

関連する問題