こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

2つのcppファイルから

1つのexeファイルを作る必要性が出てきました。
(現在質問中の質問に関連しています。)
例えば

file.cpp:
#include<iostream>
using namespace std;
void Output(int x)
{
cout<<x<<endl;
}
void main(void)
{
for(int i=0;i<9;Output(i++));
}
をコンパイルリンクすれば済むことを

file1.cpp:
#include<iostream>
using namespace std;
void Output(int x)
{
cout<<x<<endl;
}

file2.cpp:
void main(void)
{
for(int i=0;i<9;Output(i++));
}

という風に分かれているファイルをコンパイルリンクしなければならないのです。

cpp -e file.exe -c file1.cpp -c file2.cpp
ではエラーになります。
どうすれば良いのでしょうか?

投稿日時 - 2003-10-27 04:30:05

QNo.689984

暇なときに回答ください

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

Borland C++なら
 bcc32 -efile.exe file1.cpp file2.cpp
でfile.exeが生成されませんか?

投稿日時 - 2003-10-27 05:43:20

補足

ありがとうございます。

Borland C++ 5.5です。

c:\borland>bcc32 -efile0.exe file1.cpp file2.cpp
file1.cpp:
file2.cpp:
エラー E2268 file2.cpp 3: 未定義の関数 'Output' を呼び出した(関数 main() )
*** 1 errors in Compile ***

となるのです。
マイクロソフトのDirectXの1つのサンプルをコンパイルするために
そのサンプルに使われているクラスメンバの定義が複数のCPPファイルに格納されていて
一緒にコンパイルしなければならないのです。

投稿日時 - 2003-10-27 13:55:31

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

>c:\borland>bcc32 -efile0.exe file1.cpp file2.cpp
>file1.cpp:
>file2.cpp:
>エラー E2268 file2.cpp 3: 未定義の関数 'Output' >を呼び出した(関数 main() )
>*** 1 errors in Compile ***

file1_def.h :
void void Output(int x);

file1.c, file2.c :
#include "file1_def.h"

 DirectXを使うとかより、C言語の文法の勉強が先!ちゃんと必要なヘッダーファイルをインクルードしてください(← http://www.okweb.ne.jp/kotaeru.php3?q=689531 )。

 SDKに「include」か「必要条件」か「ヘッダー」か「動作環境」の項目に書いてあるはずです。

例: IDirect3D8::CheckDepthStencilMatch
動作環境
ヘッダー : D3d8.h で宣言。
インポート ライブラリ : D3d8.lib を使用。

このインタフェースを使用するファイルでは、ファイルの先頭付近に
#include <D3d8.h>
が必要。また、リンクするには「D3d8.lib」を含めなければならない。

投稿日時 - 2003-10-27 14:28:42

補足

ありがとうございます。

下の補足と行き違えになったみたいです。

投稿日時 - 2003-10-27 14:41:10

ANo.3

file2.cppで使用するOutput関数を定義したヘッダファイルfile.hを作成するのが一般的なのでは?


file.h:関数Outputの形式を定義
void Output(int x) ;

file.cpp:関数Outputの処理内容を記述
#include"file.h"//file.hで定義されたOutputを使用、Outputの処理を記述することを宣言
#include<iostream>
using namespace std;
void Output(int x)
{
cout<<x<<endl;
}

file2.cpp
#include"file.h"//file.hで定義されたOutputを使用、Outputの処理を記述することを宣言
void main(void)
{
for(int i=0;i<9;Output(i++));
}

投稿日時 - 2003-10-27 14:16:12

補足

ありがとうございます。

勿論この場合は

file1.cpp:
#include<iostream>
using namespace std;
void Output(int x)
{
cout<<x<<endl;
}

file2.cpp:
#include"file1.cpp" <-----挿入
void main(void)
{
for(int i=0;i<9;Output(i++));
}

として
c:\borland>bcc32 file2
とすればコンパイルリンクは成功します。

しかしDirectXのサンプルをコンパイルするためにサンプルの中に多くの
#include"?.cpp"
を挿入しなければなりません。
マイクロソフトはそういうことを想定してサンプルを作ったのでしょうか?

投稿日時 - 2003-10-27 14:30:24

ANo.2

makefileは?

投稿日時 - 2003-10-27 10:59:35

補足

ありがとうございます。

makeファイルをどのように記述すれば言いのでしょうか?

実は実際はDirectXのソースファイルであり数十個のファイルを一緒にコンパイルリンクしなければならないのです。
1つのサンプルをコンパイルリンクできれば良いのですが
そのサンプルはSRCディレクトリ内の複数のCppファイルで定義されているいくつかのクラスメンバ関数を使っていて
サンプルをコンパイルするためにそのサンプルとSRCディレクトリ内Cppファイルを一緒にコンパイルリンクしなければならないのです。

投稿日時 - 2003-10-27 14:03:58