0

次のソース ファイルに分割された単純なプロジェクトがあります。

my.h:

#ifndef MY_H
#define MY_H

extern int val;     
void print_val();   

#endif

my.cpp:

#include "my.h"
#include <iostream>

void print_val()
{
    std::cout << val;
}

main.cpp:

#include "my.h"

int main()
{
    val = 4;      
    print_val();  

    return 0;
}

コンパイルすると、次のエラーが表示されます。

1>main.obj : error LNK2001: unresolved external symbol "int val" (?val@@3HA)             
1>my.obj : error LNK2001: unresolved external symbol "int val" (?val@@3HA)     
1>c:\...\test.exe : fatal error LNK1120: 1 unresolved externals

これはなぜですか?ヘッダーで変数と関数を宣言し、別のソース ファイルで関数を定義したいだけです。私は Visual C++ 2010 Express を使用しており、プロジェクトは Win32 コンソール アプリです。

4

2 に答える 2

4

おそらく、次のように、自分my.cppの extern 変数を定義したいと思うでしょう。

int val; // optionally you can also initialize it here, like this: int val=0;

これにより、コンパイラが実際にこの変数にオブジェクトを割り当て、後で実行可能ファイルにリンクできるようになります。

関連する注意事項 -すべてのソース ファイルにそのような変数の定義が1 つしかないことを確認してください。そうしないと、シンボルが重複し、リンカーがそれに満足できなくなります。extern

于 2012-07-25T00:15:55.633 に答える
2

関数を定義していますが、変数を宣言していませんval。そのため、そのシンボルが見つかりません。

于 2012-07-25T00:16:05.017 に答える