C++/MFCで以下のようなエラーが出て困っております。
だれか、原因の分かる方はいらっしゃいますでしょうか?

1>Test.obj : error LNK2001: 外部シンボル ""public: __thiscall CSampleApp::CSampleApp(void)" (??0CSampleApp@@QAE@XZ)" は未解決です。
1>C:Test\src\Test\Release\Test.exe : fatal error LNK1120: 外部参照 1 が未解決です。

エラーのあったソースコード
---------------------------------------------------------
#include "../Sample/Sample.h"

void Test::Onfile()
{
std::auto_ptr<CSampleApp> p( new CSampleApp() );//←このソースコードを追加するとエラーになります。
}

---------------------------------------------------------

Sample.h
---------------------------------------------------------

class CSampleApp : public CWinApp
{
public:
CSampleApp();
};
extern CSampleApp atTheApp;
----------------------------------------------------------

このQ&Aに関連する最新のQ&A

A 回答 (2件)

リンカは、CSampleApp::CSampleApp() がないといっています。


(new で、コンストラクタが使われるのに、実装がないのでエラーになったのです。)
つまり、

> class CSampleApp : public CWinApp
> {
> public:
> CSampleApp(); // こいつが未実装です。
> };

ということです。
普通は、Sample.h 内にインライン形式でかかれるか、Sample.cpp 内に書きます。
ま、Sample.h 内に書いた例だと、

class CSampleApp : public CWinApp
{
public:
CSampleApp()
{
// やることねー.しごとくれー.
}
};

こんな感じです。
    • good
    • 0
この回答へのお礼

確かに、実装のソースコードが入ってませんでした。
ありがとうございます。

お礼日時:2011/04/21 23:39

LNK2001で検索するといっぱい出てきそうですが……



CSampleApp()の本体が含まれたオブジェクトファイル(ライブラリファイル)がリンカに渡されていないので、
実行ファイルが生成できません。
ってことになります。

ライブラリを追加するか、ソースをプロジェクトに追加してビルドするようにするか…になるかと。
# Sample.h に実体が記述されているのならばそんな必要はない…でしょうが。それならリンクエラーにはならないでしょう。
    • good
    • 0
この回答へのお礼

言われていることをやってみたのですが、解決しませんでした。
なにか、難しい問題でもあるのでしょうか?

お礼日時:2011/04/21 14:37

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q変な子供の意味不明な解答の対処法教えてください。

変な子供の意味不明な解答の対処法教えてください。

Aベストアンサー

ありがとう。

でOK

解答でなく回答のことでしょう?
まさかですが、テストの解答に感情論ってことはないでしょう。

Q【VC++】MFC、C++/CLI(CLR)、C#の違い、及び、これからの展望

いつも大変お世話になっています。
VC++初心者です。

VC++6.0(MFC)、VC++2005(CLR)(C++/CLI)(Express Edition)を
同時期に使い始めて何ヶ月か経ちました。
現在では、CLIの方が圧倒的に開発スピードが早く(扱いやすい)、
逆に、MFCの開発スピードが遅く(扱いにくい)、イライラしっぱなしです。
(CLIの開発では、WEBにあるC#のコードを参考にしながら、
 コーディングしています。)

そこで、何点か疑問に思ったので、ご回答頂けませんでしょうか。
(1)CLIとC#を区別した理由は何なのでしょうか。
(2)MFCはこれからも使われるのでしょうか。
 (MFCで新規開発をすることは、まだまだ大勢なのでしょうか。)
(3)VC++2005以降、MFCは有償らしいのですが、
 VC++6.0(MFC)とVC++2005(MFC)は何か変わったのでしょうか。
 (コーディングしやすくなっていますか?)
(4)個人差はあると思いますが、開発スピードが一番早いのは、
 CLR、C#、MFCのどれでしょうか。
 
すぐに返信ができないと思いますが、
宜しければ、ご回答頂けると幸いです。

いつも大変お世話になっています。
VC++初心者です。

VC++6.0(MFC)、VC++2005(CLR)(C++/CLI)(Express Edition)を
同時期に使い始めて何ヶ月か経ちました。
現在では、CLIの方が圧倒的に開発スピードが早く(扱いやすい)、
逆に、MFCの開発スピードが遅く(扱いにくい)、イライラしっぱなしです。
(CLIの開発では、WEBにあるC#のコードを参考にしながら、
 コーディングしています。)

そこで、何点か疑問に思ったので、ご回答頂けませんでしょうか。
(1)CLIとC#を区別した理由は何なのでしょうか...続きを読む

Aベストアンサー

私も私見ですが。

> (1)CLIとC#を区別した理由は何なのでしょうか。
CLIはC++的だが、C#はJava系の文法。近いけど遠い。
要するに慣れ親しんだC++を使いたい人向け。

> (2)MFCはこれからも使われるのでしょうか。
市販ソフトメーカーなど企業で資産のあるところは使っていくでしょうね。シェア・フリーソフトの作家でもそうですが。
C#とCLIは、インストール時に.net frameworkのインストールがあるから嫌われている所があるんじゃないでしょうか。.net系のソフトですよってばれますし。逆コンパイルがネイティブより容易ってのがライセンス認証しているメーカーとかシェアウェア作者さんには気になるポイントでしょう。一応難読化ツールもありますが。

> (4)個人差はあると思いますが、開発スピードが一番早いのは、
> C++/CLI、C#、C++とMFCのどれでしょうか。
C#かなぁ。
まぁ、面倒なソフトになったらどれでもさほど変わり無い気がしますね。ただ、.NET系はガベージコレクションがうれしいですが。

私も私見ですが。

> (1)CLIとC#を区別した理由は何なのでしょうか。
CLIはC++的だが、C#はJava系の文法。近いけど遠い。
要するに慣れ親しんだC++を使いたい人向け。

> (2)MFCはこれからも使われるのでしょうか。
市販ソフトメーカーなど企業で資産のあるところは使っていくでしょうね。シェア・フリーソフトの作家でもそうですが。
C#とCLIは、インストール時に.net frameworkのインストールがあるから嫌われている所があるんじゃないでしょうか。.net系のソフトですよってばれますし。逆コンパイルが...続きを読む

Qくだらない質問、意味不明のタイトルの対処法

くだらない質問、意味不明のタイトルの対処法
ほんの一部の質問者だけだと思いますが、「質問内容があまりにもくだらない」とか、質問のタイトルが「質問します」「助けてください」「困っています」など、質問内容がタイトルから想像できない質問はどのように対処されていますか?
また、質問のタイトルと質問文が同じ質問はどうされていますか?
無視されていますか?
何分、初めてのことですので、少々とまどっています。

Aベストアンサー

回答するかどうかは、回答者自身の気分次第です。
少なくとも、わたしはそうです(笑)。

「質問します」「助けてください」「困っています」などは、とりあえず見ます。
内容を見て答えたいと思えば答えるし、あまりに重い質問で「そんなのムリ」と思えば
答えません。そんなもんですよ。

タイトルと質問文が同じ・・・これは質問によります。
くだらなくても、面白そうなら答えるし。
あまり深く考えなくていいと思いますよ^^

QVC++でのリンクエラー [error LNK2005]

VC++でMFCを使用してダイアログベースのEXEを
作成しています。
以下のクラスのメンバ関数などを使用して、色の操作をしています。
CDC::SetBkColor()
CDC::SetTextColor()

ビルド時、以下のリンクエラーとなりました。

----------------------------------------------
nafxcw.lib(afxmem.obj) : error LNK2005:
"void __cdecl operator delete(void *)"
(??3@YAXPAX@Z) はすでに LIBCMT.lib(delete.obj) で
定義されています

Release/MenueTest.exe : fatal error LNK1169: 1 つ
以上の複数回定義されているシンボルが見つかりました
link.exe の実行エラー
----------------------------------------------

MFC と C(?)のライブラリで delete()関数が競合しているようですが、これを回避する方法をご存知の方、ご教授願います。

<環境>
OS:Windows2000
VC++6.0

<備考>
リンクエラーになるのは以下の組み合わせです。
「MFCをスタティックリンクする+リリース版」

MFCをスタティックリンクしてもデバッグ版のビルドだとエラーになりません。
また、MFCをスタティックリンクしない場合もエラーにはなりません。
ただし、リンクエラーにならなかった場合、どちらのオブジェクトの delete()関数が呼ばれるか不明で、それが正しいのかも心配です。

VC++でMFCを使用してダイアログベースのEXEを
作成しています。
以下のクラスのメンバ関数などを使用して、色の操作をしています。
CDC::SetBkColor()
CDC::SetTextColor()

ビルド時、以下のリンクエラーとなりました。

----------------------------------------------
nafxcw.lib(afxmem.obj) : error LNK2005:
"void __cdecl operator delete(void *)"
(??3@YAXPAX@Z) はすでに LIBCMT.lib(delete.obj) で
定義されています

Release/MenueTest.exe : fatal error LNK1169: 1 つ
...続きを読む

Aベストアンサー

↓こちらに情報があります。
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q148/6/52.asp&NoWebContent=1

参考URL:http://support.microsoft.com:80/support/kb/articles/q148/6/52.asp&NoWebContent=1&NoWebContent=1

QFloppy disk(s) fail(40) の意味・原因と対処を教えて下さい

Floppy disk(s) fail(40) の意味・原因と対処を教えて下さい。
起動時、MemoryTestの後、このメッセージが出ます。

MotherBoard:FIC VA-503+
BIOS:Award V4.60PGA です。

よろしくお願いします。

Aベストアンサー

意味:
フロッピーディスクが認識できません。

原因:
フロッピーケーブルの挿し間違い、断線、電源ケーブルの不良、
FDD自体の不良、BIOS上での設定ミス、マザーボードのFDDポートの故障など

ちゃんとケーブルが刺さっているか、ほかのPCにFDDを接続してみて問題ないか、
ケーブルを変えて問題ないか、BIOSの設定は正しいか確認しましょう。

QC++ の LNK2001エラー

「sample.obj : error LNK2001: 外部シンボル ""void * __cdecl SetupDiGetClassDevsW(struct _GUID *,wchar_t const *,struct HWND__ *,unsigned long)" (?SetupDiGetClassDevsW@@$$FYAPAXPAU_GUID@@PB_WPAUHWND__@@K@Z)" は未解決です。」というエラーメッセージが出ます。

 ソース中に

extern "C" {
#include "hidsdi.h"
#include <setupapi.h>
}
#pragma comment(lib, "setupapi.lib")
#pragma comment(lib, "hid.lib")

 の記述をしています。

 Visual C++ 2005 Express Edition で
[プロジェクト] -> [プロパティ] -> [構成プロパティ] -> [リンカ] -> [追加のライブラリ] のところにディレクトリ設定も行っています。

 どのようにしたら解決できるのでしょうか。

「sample.obj : error LNK2001: 外部シンボル ""void * __cdecl SetupDiGetClassDevsW(struct _GUID *,wchar_t const *,struct HWND__ *,unsigned long)" (?SetupDiGetClassDevsW@@$$FYAPAXPAU_GUID@@PB_WPAUHWND__@@K@Z)" は未解決です。」というエラーメッセージが出ます。

 ソース中に

extern "C" {
#include "hidsdi.h"
#include <setupapi.h>
}
#pragma comment(lib, "setupapi.lib")
#pragma comment(lib, "hid.lib")

 の記述をしています。

 Visual C++ 2005 Express Edition で
[プ...続きを読む

Aベストアンサー

SetupDiGetClassDevs のプロトタイプ宣言は
#include <setupapi.h> にあるものを使っていますか?

それとも自前で
HDEVINFO SetupDiGetClassDevs( LPGUID ClassGuid, ...);

と書いていますか?
後者ならその現象の説明がつきますが。

Qエクセル2003 メモリ不足の表示の意味・対処方法

エクセル2003 SP3 を使用中に「メモリ不足です。完全に表示できません。」のメッセージが表示されます。
OKボタンのみ表示されてますのでOKを指示すると、しばらく操作不能状態の後、正常に操作可能となります。
このメッセージの意味及び対処方法を教えて下さい。
エクセルデータのサイズは133KB、OSはXP-Pro SP3、メモリは2G搭載しております。

Aベストアンサー

Excelにおいて確保されるメモリでは表示しきれないということでしょう。
ここで、物理メモリはあまり関係しないようです。
サイズが133KBならそのファイルが壊れている可能性があると思います。
ファイル - 開く → 対象のファイルを選択して
[開く|▼]の▼をクリックして[開いて修復する]を試してみては?

QC++でのエラー LNK2001

C++でプログラミング中ビルドしたところ以下のようなエラーが出ました。解決方法がわかりません。どのようにしたら解決できるのでしょうか?

----------------------------------------------------------------

コンパイル中...
sample01.cpp
リンク中...
sample01.obj : error LNK2001: 外部シンボル "__imp__dispose_library" は未解決です
sample01.obj : error LNK2001: 外部シンボル "__imp__get_copyright_information" は未解決です
sample01.obj : error LNK2001: 外部シンボル "__imp__get_version_information" は未解決です
sample01.obj : error LNK2001: 外部シンボル "__imp__initialize_library" は未解決です
sample01.obj : error LNK2001: 外部シンボル "__imp__close_reader_writer" は未解決です
sample01.obj : error LNK2001: 外部シンボル "__imp__get_last_error_types" は未解決です
Debug/Sample01.exe : fatal error LNK1120: 外部参照 6 が未解決です。
link.exe の実行エラー

C++でプログラミング中ビルドしたところ以下のようなエラーが出ました。解決方法がわかりません。どのようにしたら解決できるのでしょうか?

----------------------------------------------------------------

コンパイル中...
sample01.cpp
リンク中...
sample01.obj : error LNK2001: 外部シンボル "__imp__dispose_library" は未解決です
sample01.obj : error LNK2001: 外部シンボル "__imp__get_copyright_information" は未解決です
sample01.obj : error LNK2001: 外部シンボル "__imp__get_v...続きを読む

Aベストアンサー

該当関数を使用しているソースコードに
#pragma comment(lib,"使用しているlib名.lib")

[プロジェクト] -> [設定] -> [リンク] -> [一般] の
オブジェクト/ライブラリ モジュール

使用しているlib名
を設定しているか確認してみてください。

Qエラーメッセージの意味と対処法を教えてくれるWebサイトを教えて下さい。

こんにちは。初心者です。重複ファイルの削除をよくわかりもしないでやってしまい、後悔しています。エラーメッセージ続出です。同じ失敗を繰り返さないためにも、エラーメッセージの意味と対処法を教えてくれるサイトがあったらお願いします。使用パソコンはFMVC916WT Windows XP です。


エラーメッセージ
・サウンドソフトウェアがインストールされていないか、または使用できません。
・システムにドライバがインストールされていません。
・WorldCupFever.TLJ32EXE-正しくないイメージ
 アプリケーションまたはDLL C\WINDOWS\system\wing.dllは正しいWindowsイメージではありません。これをインストールディスクのファイルと照合してください。 スクリプトエラー:ハンドラが定義されていません。#fileio

Aベストアンサー

http://www.asahi-net.or.jp/~vz6t-iwt/who/trouble/error_message.htm
http://www.page.sannet.ne.jp/s-mituru/errortaisaku.htm
が一例ですが、ご使用環境でのメッセージ全てにぴったりのものが収められているページはないようです。

Googleなどの検索エンジンでメッセージを文節ごとに半角スペースで区切って検索なさるとズバリのページだったり、同じエラーで悩む方が立てた掲示板がヒットしたりで、こっちのほうがいいかもしれません。

でも、今回のように複数のエラーが続出なさるのでしたら、思い切って再インストールのほうが精神衛生上もいいかと。

Q多重定義が起きている?--lnk2005エラー:VC++

今つまずいている問題は、VC++2008環境下で、以下のような構造になっているプログラムにおいて、多重定義?されているのでコンパイルが通らないというものです。

ソースコードを載せることは大きすぎてできないので、問題となる部分の記述のみ抽出して書きます。

-------define.h----------
・・・・(module.h内の関数に使われる型の定義など)
---------------------------

-------module.h----------
#include "define.h"
void mod_1(void){・・・}
void mod_2(void){・・・}
---------------------------

このように、2つのヘッダーファイルがあり、define.hをインクルードしてmodule.hを使うという構造です。
(一般的ではないようですが、module.h内にmod_1やmod_2の実体を書き込んでいます。)

その中で、以下のようなcppソースファイルがあります。

-------Main.cpp----------
#include "module.h"   (他のMain.cpp内の関数の都合上、Main.cppでもmodule.hをインクルードしています。関係あるかもしれないと思い書きました。)
int main(){
M();
N();
}
------------------------

-------M.cpp----------
#include "module.h"
void M(void){
mod_1();
mod_2();
}
----------------------

-------N.cpp----------
#include "module.h"
void N(void){
mod_1();
mod_2();
}
----------------------

とすると、コンパイルの結果は次のようになります。

1>N.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に M.obj で定義されています。
1>N.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に M.obj で定義されています。

多重定義や多重インクルードは起こしていないと思っていますが、M.cppとN.cpp内の定義が衝突する理由がわかりません。どなたか理由が思いつく方、教えていただけたら幸いです。お願いいたします!!

◆◆◆   ◆◆◆   ◆◆◆   ◆◆◆   ◆◆◆

ちなみに、たとえばMやNとまったく同じ「A.cpp」を作り、このように書いたとします。
-------A.cpp----------
#include "module.h"
void A(void){
mod_1();
mod_2();
}
----------------------
そしてmain関数の中に、MやNと同様に『A();』を付け加えたとします。

すると、実行結果はこのようになります。

1>M.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に A.obj で定義されています。
1>M.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に A.obj で定義されています。

1>N.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に A.obj で定義されています。
1>N.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に A.obj で定義されています。

VC++はファイル名のアルファベット順にコンパイルするようですが、どちらにせよmain関数内で呼び出されていること以外何の関わりも無いはずのA、M、Nの中での出来事が、衝突する理由が、調べども思い当たりません。

お願いいたします。

今つまずいている問題は、VC++2008環境下で、以下のような構造になっているプログラムにおいて、多重定義?されているのでコンパイルが通らないというものです。

ソースコードを載せることは大きすぎてできないので、問題となる部分の記述のみ抽出して書きます。

-------define.h----------
・・・・(module.h内の関数に使われる型の定義など)
---------------------------

-------module.h----------
#include "define.h"
void mod_1(void){・・・}
void mod_2(void){・・・}
-----------------...続きを読む

Aベストアンサー

インクルードファイルは#include宣言した部分に展開されます。

extern宣言等は単なる外部参照なので重複しても問題はありませんが、ヘッダファイルにソースの実体が書かれている場合は、インクルードしたすべてのソースファイルに同じ関数が展開され、実体が出来ます。
つまり、
#include "module.h"
と書かれているすべてのファイルに
void mod_1(void){・・・}
void mod_2(void){・・・}
が書かれていることと同じなので、リンク時に多重定義でエラーになります。

一般的には「module.h」には
extern void mod_1(void);
extern void mod_2(void);
の外部参照だけを記載し、関数の実体は別のソースファイルに記述します。


人気Q&Aランキング