• ベストアンサー

他の.CPPファイルに定義した関数を呼び出す方法について

新規作成したプロジェクトに、 以前自分が作成した.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なので)、 ツール自体のプロパティを弄らない方法があるのでしたら、 多少面倒でもそちらの方が好ましいです。 追加する方法があるかどうか、 あればその方法をご存じでしたら教えていただければ嬉しいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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だけ」とは決めてないので「過去に作ったソースファイルを丸ごとインクルードして使う」のもアリなのだ。 かなり強引で邪道だけどね。

hiroko_ss
質問者

お礼

試してみたところ上手くいったようです! 私自身まだまだ駆け出しの初心者なので、 C++のファイルや.hファイル以外は、 読み込めないものと思っていました。 まさに固定概念を打ち破る方法ですね・・・。 確かに多少強引ではありますが。 色んな意味で勉強になりました。 返答ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • prophetok
  • ベストアンサー率44% (13/29)
回答No.1

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

hiroko_ss
質問者

お礼

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

すると、全ての回答が全文表示されます。

関連するQ&A