2

これは些細なことかもしれませんが、その理由が気になります。

これは私の友人の練習コードから来ています:

#include <iostream>

using namespace std ;
extern int* PPPP;

void main(){
    cout<<"*PPPP"<<*PPPP<<endl;
}

誤って、PPPP は実際にはどこにも宣言されていません。しかし不思議なことに、これを静的ライブラリにコンパイルできます。ただし、これを dll にすることはできません。リンク エラーがあります (未解決の外部システム pppp)。

静的ライブラリを作成する場合、PPPP という名前 (extern ですが) はとにかくメモリにスペースがあるためであると推測されます。これで問題は発生しません。

これについてはまったくわかりません。これについて、より正確な情報をお待ちしております。

前もって感謝します。

4

3 に答える 3

5

スタティック ライブラリは、別のファイル セットにリンクされることを意図しているため、後の段階で解決される未定義のシンボルが含まれている可能性があります (そうでない場合、リンカー エラーが発生します)。

ただし、DLL は実行可能ファイルと同様に完全にリンクする必要があるため、未定義の参照を含めることはできません。

于 2013-03-22T07:18:51.363 に答える
1

静的ライブラリにすると、リンカーは、完全にリンクされたときに未解決のシンボルが利用可能になると想定していると思います。

そのスタティック ライブラリを、PPPPdefined というシンボルのないプログラムにリンクすると、リンカ エラーで失敗します。

于 2013-03-22T07:18:17.473 に答える
0

あなたが言う時:

extern int* PPPP;

PPPP別の翻訳単位にあるコンパイラを約束しています。

リンカーは、指定されたオブジェクト ファイルとライブラリを見つけようとします。見つからPPPPない場合は、エラーが発生します。

于 2013-03-22T07:18:54.897 に答える