遅刻の「言い訳」選手権

新規作成したプロジェクトに、
以前自分が作成した.cppファイルと.hファイルを
そのまま使えないかと考えています。
(※仮にそのファイルの名前を "define.cpp" "define.h" とします)

プロジェクトに新規ファイル main.cpp を作成して、
define.hをインクルードし、
以下のようなテストのプログラムを組みました。


・../util/define.cpp----------------------
#include <iostream>
#include "define.h"
void test(){ std::cout<<"test."<<std::endl; }

・../util/define.h------------------------
#pragma once
void test();

・main.cpp----------------------------
#include "../util/define.h"
int main(){
 test();
 return 0;
}


上記のソースを VisualC++7.0 でビルドすると、
main.cppの3行目で以下のようなエラーが出ました。

> LNK2019: 未解決の外部シンボル "void __cdecl test(void)" が関数 _main で参照されました

VisualC++で「既存項目の追加」という項目より、
実体の定義されたdefine.cppをプロジェクトに追加していないため
当然といえば当然なのですが・・・

C言語でいうところの<stdio.h>等みたいに、
わざわざプロジェクトにCPPファイルを追加しなくても
関数を呼び出せるようには出来ないのでしょうか?

全ての関数と処理をヘッダーファイルに記述すると解決ですが
物凄く見辛いのでそれは避けたいのです。
また、色々なPC間で使っているため(学校のPCなので)、
ツール自体のプロパティを弄らない方法があるのでしたら、
多少面倒でもそちらの方が好ましいです。

追加する方法があるかどうか、
あればその方法をご存じでしたら教えていただければ嬉しいです。
よろしくお願いします。

A 回答 (2件)

「プロジェクトにソースファイル(*.cpp)を追加」すればよい。



今のプロジェクトは「main.cppだけしか無い」と思ってる。

なので、main.exeを作ろうとして
main.cppをコンパイル

main.objをリンク

main.exeを作る
って事をする。すると「test()の実体がどこにも無い」って言われる。

なので、プロジェクトにソースを追加して
main.cppと
../util/define.cppをコンパイル

main.objと
../util/define.objをリンク

main.exeを作る
って言う感じにしないとならない。

それが面倒なら
main.cpp----------------------------
#include "../util/define.cpp"
int main(){
 test();
 return 0;
}
って書いてもOK。(インクルードパスに../utilが足してあるなら)

誰も「インクルードしていいのは*.hだけ」とは決めてないので「過去に作ったソースファイルを丸ごとインクルードして使う」のもアリなのだ。

かなり強引で邪道だけどね。
    • good
    • 0
この回答へのお礼

試してみたところ上手くいったようです!

私自身まだまだ駆け出しの初心者なので、
C++のファイルや.hファイル以外は、
読み込めないものと思っていました。

まさに固定概念を打ち破る方法ですね・・・。
確かに多少強引ではありますが。

色んな意味で勉強になりました。
返答ありがとうございます。

お礼日時:2009/06/19 18:22

DLLを作ってリンクするのが一般的でしょう。

    • good
    • 0
この回答へのお礼

なるほど・・・ライブラリですね。
ただ、.dllファイルを実行ファイルと同じパスか、
WinXPならSystem32フォルダに入れなきゃ起動しないのが
多少面倒かなという気もします・・・。
返答ありがとうございます。

お礼日時:2009/06/19 18:22

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

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


おすすめ情報