2012-01-25 20 views
2

次のファイルを含むVisual Studio 2010のサンプルC++プロジェクトを作成しました。 A.cppVisual Studio 2010のLNK2019エラー

ああ

#ifndef A_H 
#define A_H 

#include <iostream> 

void foo(); 

#endif 

#include "A.h" 

void foo() 
{ 
    int a = 1; 
} 

main.cppに

#include "A.h" 

int main(int argc, char* argv[]) 
{ 
    foo();  

    return 0; 
} 
私がビルドした後、次の出力を取得しています

1> --- ---ビルド開始:プロジェクト:opengl_test 、構成:デバッグのWin32 ------

1> main.cppに

1>ああ

1> A.cpp

1>コードの生成...

1> Debug \ A.obj:警告LNK4042:複数回指定されたオブジェクト。エラーLNK2019:未解決の外部シンボル "無効__cdeclのfoo(無効)"(FOO @@ YAXXZ?)

1> C _main機能で参照:エキストラは

1> MAIN.OBJ無視ALP \ \ユーザー\ Projects \ Test Samples \ opengl_test \ Debug \ opengl_test.exe:致命的なエラーLNK1120:未解決の外部が1個

==========ビルド:0成功、1失敗、0最新、0スキップ==========

このエラーの原因は何ですか?

+0

[Visual Studio 2010の奇妙な "警告LNK4042"]の可能な複製(http://stackoverflow.com/questions/3695174/visual-studio-2010s-strange-warning-lnk4042) –

+0

価値があるのは、私は**私はあなたの3つのコードファイル( '' Ah'、 'A.cpp'、' main.cpp')を追加してコンパイルしました。うまく動作し、エラーは発生しません。ですから質問は、あなたの設定が私のものと何が違うのですか(とあなたが質問で説明したもの)ですか? –

+0

@CodyGray私は新しいソリューションを作成し、これらのファイルをプロジェクトに追加しましたが、エラーや警告なしでビルドできます。問題は、最初にopengl/glut関数を参照していたプロジェクトで、ある時点でVisual StudioがこのLNK2019エラーを出すようになり、ここで説明したようにすべての時間を与えていないということですhttp://stackoverflow.com/questions/8996385/ c-unresolved-external-symbol-after-cleanを実行します。その後、それは常にそれを与え始めた。だから私はこの単純な形式にプロジェクトを変換し、それはエラーを与え続けた。私は2つのプロジェクトの構成上の違いの原因を知らない。 –

答えて

3

A.hはヘッダグループではなくプロジェクトのソースグループにあると考えられます。したがって、A.cppA.hの両方がオブジェクトファイルA.objを生成するので、最後のものコンパイルするのはリンクされた唯一のものです。最後にコンパイルされたものはA.hでした。 nの実装がfoo()であるため、リンカーはそれを見つけることができませんでした。

+0

これは私の説明よりも合理的です。 –

+0

ただし、プロジェクトをクリーンアップした後にエラーが発生します。 Visual Studioですべてのobjファイルを削除して新しいファイルでコンパイルするべきではありませんか? –

+0

@AlpHancioglu、プロジェクトを浄化することは必要なステップですが、 'Ah'を' Sources'グループから移動することもあります。 –

0

EDIT: ネヴァーマインドオリジナルの答え(下記)、私はここかもしれためにあなたが探しているものと考えている:(?ない問題、多分サウンドアドバイス)Visual Studio 2010's strange "warning LNK4042"

オリジナルの答え: あなたのヘッダーがすべき周囲に警備員がいなければ、呼び出されるたびに定義され、再定義が行われます。

#ifndef A_H 
#define A_H 

#include <iostream> 

void foo(); 

#endif //A_H 
+0

それは定義のようには見えません。プロトタイプ。これは「C++はCのように動作しません」というもう一つのケースですか? – sarnold

+0

@ニックそれらを追加しましたが、同じエラーです。 –

+0

OPは同じコンパイルユニットにa.hを含めていないので、これは一般的には良いアドバイスですが、この質問には当てはまりません。 – dasblinkenlight

0

まず、 "a.cpp"ファイルに "a.h"を含む行の前に "stdafx.h"を含める必要があります。

第2に、プロジェクト "ヘッダファイル"に "a.h"を追加し、 "ソースファイル"に "a.cpp"を追加する方が良いです。

それは間違いなくコンパイルされます! 幸運。

"stdafx.h"を含める理由は、デフォルトでは、プロジェクトがプリコンパイル済みヘッダーを使用するため、コンパイラが "stdafx.h"を検索する理由です。

"precompiled Header"を無効にして "stdafx.h"を必要とせず、すべて正常です。

+0

なぜstdafx.hをインクルードする必要がありますか?これはVisual C++アプリケーションではなく、MFCクラス、Windows API関数、または.NETを対象としません。これは、シンプルなネイティブC++アプリケーションです。ヘッダーファイルはヘッダーファイルセクションの下にあり、cppファイルはあなたの言ったようにソースファイルセクションの下にあります。 –

+0

@Alp: 'stdafx.h'はプリコンパイルされたヘッダのデフォルト名です。それはあなたが言及した技術のどれとも本質的には関係ありません。しかし、プリコンパイルされたヘッダーは*オプションですが(デフォルトで有効になっていますが)、プリコンパイル済みのヘッダーには任意の名前を付けることができます。そう、答えのこの部分は間違っている可能性が高いです。しかし 'stdafx.h 'についてのあなたの理解も間違っています。 :-) –

+0

こんにちは、すべて。それを試して、間違っているかどうかを確認する必要があります。実際には私は "stdafx.h"を含めるべきではないと思いました。しかし、コンパイラはそれを含めるべきであると訴えていました。ビンゴ、それは動作します! –

0

コードは新しいプロジェクトを作成したときに機能します。私は確かではありませんが、エラーの理由は、 "C:¥Program Files¥Microsoft SDKs¥Windows¥v7"というフォルダを追加したことが原因です。1 \ Include "をプロジェクト設定で使用し、Visual Studioには既に" C:¥Program Files(x86)¥Microsoft SDKs¥Windows¥v7.0A¥Include "フォルダ(32ビットプログラム用)が含まれています。 OpenGLヘッダファイルをProgram Files(x86)のインクルードフォルダに追加し、64ビットのProgram Filesフォルダのインクルードを削除しました。そして、OpenGLコードが今働いているようです。

関連する問題