プロが教える店舗&オフィスのセキュリティ対策術

VC++ C初心者です
自社開発した画像形式の画像を表示するViewerを作成する事になり
SDKで開発を進めていましたが、MFCの方が開発効率が
良さそうなので、必要な部分(ファイルからPixcel単位のRGB値を読み書きする処理)を部品化してヘッダファイル・CPPファイルにまとめてMFCフォームへ移行を始めました

開発環境は
VC++ .Net2003です

上司からMFCベースの簡易Viewer「SimpleImage」(多分マイクロソフトのHPから拾って来たソースと思います)
を受け取り、元プログラムの主要な部分を関数にまとめて移行を始めたのですが、

ビルドでエラーが2つ発生して、先に進めなくなりました

〓エラー(1)〓
SimpleImage fatal error LNK1120: 外部参照 1 が未解決です。

〓エラー(2)〓
SimpleImage error LNK2019: 未解決の外部シンボル
"class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > >
__cdecl GetUseFicFileName(class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > >)
" (?GetUseFicFileName@@YA?AV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@V12@@Z) が関数 "
public: void __thiscall CChildView::OnFileOpenimage(void)" (?OnFileOpenimage@CChildView@@QAEXXZ) で参照されました。







移行先のメインCPP内部で「私が作ったファイル
(以後、"abc.h"・"abc.cpp"と呼びます)includeを追記してビルドする処までは、問題無かった(ビルドが出来た)のですが、


メインのCPPファイル内で"abc.h"に記載された関数を呼び出そうとすると上記2つのエラーが出力され、先に進めない状況です


多分、ライブラリ等の参照先が上手に行なえていないのかと思っているのですが、初心者で原因が
まるで特定できないので質問させて戴きました


皆様!助言お願いしますm(__)m

A 回答 (3件)

移行方法が書かれていないんですけど。



もちろんMFCのプロジェクトを作って、そこに自分で定義した関数がかかれたソースを追加していくといったイメージなんですよね?

で、CString、abc.cppで使ってますか?

この回答への補足

すみません補足させて戴きます

他人が作ったMFCプロジェクトに自分が作った
abc.cpp と abc.h を追加しました

CStringは abc.cpp で使ってます

abc.cppとabc.hの両方に
#include <atlstr.h>
を記載してます
(根本的にあっているかどうか判ってないですが
ビルドは出来ました)

補足日時:2005/05/18 18:55
    • good
    • 0

>#include <atlstr.h>



おそらく不要でしょう。


MFCでは、デフォルトでstdafx.hというプリコンパイル済みヘッダを使用しています。
このため、ウィザードで作成分を含む各ソースでは、
#include "stdafx.h"
と、インクルードする必要があります。

個別のcppファイルでライブラリ等のヘッダをインクルードは基本的に行いません。ライブラリのヘッダを追加したい場合はstdafx.hに追記していきます。

この回答への補足

>#include <atlstr.h>
上記のインクルード文をコメントにして
実行したところ、前回のエラーは回避できましたが
CString 宣言子を理解してくれてないのか、以下のエラーが出力されてしまいます

〓エラー〓
error C2059: 構文エラー : ')'
error C2086: 'int CString' : 再定義されました。
error C2086: 'int GetUseFicFileName' : 再定義されました。
error C2086: 'int GetUseFicFileName' : 再定義されました。




"GetUseFicFileName"はabc.cpp abc.h に宣言されている関数です

一応プロジェクトのプロパティを確認してみました

「構成プロパティ」→「C/C++」→「プリコンパイル済みヘッダー」を調べてみると以下の様に成っています

プリコンパイル済みヘッダーの作成/使用
= "プリコンパイル済みヘッダー ファイルを使用する(/Yu)"

ファイルを使用して PCH を作成/使用
             ="StdAfx.h"

プリコンパイル済みヘッダー ファイル
="$(IntDir)/$(TargetName).pch"

このあたりに、ビルドがCStringを無視する起因があるのですかね?
(移行する時から、このヘンでハマるとは思ってましたが、経験不足で
深みにハマったまま出れません・・・・、なにかピンと来たら助言戴けませんか?)

補足日時:2005/05/19 11:55
    • good
    • 0
この回答へのお礼

#include "stdafx.h"をabc.cppの一番先頭でインクルードする事で対処出来ました

#include <atlstr.h>
#include <afxstr.h>
でCStringを2回インクルードしてビルドエラーを起こしていた様です

しばらくこんなケースで悩まされそうです
勉強になりました、taka_tatsuさん有難うございます

お礼日時:2005/05/20 11:37

>error C2086: 'int GetUseFicFileName' : 再定義されました。


>error C2086: 'int GetUseFicFileName' : 再定義されました。

これって、どこのファイルでエラーが出てますか?abc.hですか?abc.cppですか?MFCのウィザードが作成したファイルですか?それともリンク時ですか?

abc.hまでstdafx.hに追加してませんか?
    • good
    • 0

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