2011-02-07 8 views
-1

main()で1つのcppファイルがあります。 これは、別の構造体や関数(header.hppなど)に依存しています。 構造体は、関数プロトタイプとともにheader.hppで定義されています。関数はheader.cppに実装されています。1 cppファイル内の関数を別の関数で使用するときの問題

header.hpp:

#ifndef HEADERDUR_HPP 
#define HEADERDUR_HPP 
struct my_thing{ 
    int blah; 
}; 
int see_blah(my_thing*); 
#endif 

header.cpp:

undefined reference to `see_blah(my_thing *)` 

だから概要を与えるために:私はコンパイルしようと

は、私はというエラーメッセージが表示されます

#include "header.hpp" 
int see_blah(my_thing * thingy){ 
    // ... 
} 

main.cpp :

#include <iostream> 
#include "header.hpp" 
using namespace std; 
int main(void) 
{ 
    thinger.blah = 123; 
    cout << see_blah(&thinger) << endl; 
    return 0; 
} 

私は何が間違っているのか分かりません。私は答えを見つけることができません。何かお返事ありがとう、彼らは非常に感謝しています!

+0

両方のソースファイルをコンパイルしていますか? – Mahesh

+0

あなたはそれぞれのcppファイルを.oファイルにコンパイルしてからリンクするのですか? –

+0

受け入れられた回答が問題を解決した場合、あなたの質問はあまりうまく策定されていませんでした。あなたのコードはそのままコンパイルされません(コンパイル時に少なくとも2つのエラーがあります)。苦いことではありません:-)それはただの質問です。正確でない限り、私の唯一の要求はあなたが将来もっと世話をすることです。ここでは、構造定義の最後にセミコロンがあると仮定できますか? – paxdiablo

答えて

2

コードは問題ありません。あなたはそれを間違って編集しているだけです。お試しください:

g++ main.cpp header.cpp 
+0

が最短回答となり、すべてが修正されました...ありがとう:P –

2

以下を行う必要があります。あなたの* main.cppにファイル内

#include "header.hpp" 

+0

OOPS ...私はそれを、私のサンプルコードに入れて忘れてしまった。 –

1

header.hppが含まれている場合は、おそらく、それをリンクしていない可能性があります(header.cpp)main.cppと。どのような環境(g ++やVC++)を使っていますか?

編集:あなたが書く必要があります++グラムにリンクする:

g++ main.cpp header.cpp -o program 

また、あなたがあなたの構造体の最後にセミコロンが欠落しています!

+0

linux、g ++。サンプルコードをもう一度見てください。私はそれをチェックしました、そして、これは私が今回持っているものです。 –

+0

@ K-RAN編集 – UmmaGumma

4

構造定義の末尾にセミコロンがないことに注意してください。これは、2つの部分(おそらくは別々の部分)を一緒に折り畳むことを意味し、結果として関数プロトタイプを取得していないことを意味します。

以下の罰金コンパイル(だけでなく、他のエラーのカップルを固定した後):

// main.cpp 
#include <iostream> 
#include "header.hpp" 
using namespace std;   // <- not best practice, but irrelevant here :-) 
int main(void) 
{ 
    my_thing thinger;   // <- need this! 
    thinger.blah = 123; 
    cout << see_blah(&thinger) << endl; 
    return 0; 
} 

// header.cpp 
#include "header.hpp" 
int see_blah(my_thing * thingy){ 
    // ... 
} 

// header.hpp 
#ifndef HEADERDUR_HPP 
#define HEADERDUR_HPP 
struct my_thing{ 
    int blah; 
};        // <- see here. 
int see_blah(my_thing*); 
#endif 

と:

g++ -o progname main.cpp header.cpp 

gcc

が実際にそのコードでエラーを与えた私はよそう投稿しましたコンパイラがなぜそうしたのかはわかりません。上記のコマンドラインも重要です。コンパイルとリンクを一度に行う場合は、必要なC++ソースファイルをすべて提供する必要があります(そうしないと、リンカはすべてのものにアクセスできなくなります)。

+0

その行のqqは何ですか? –

+0

@ K-RAN、それは入力が簡単なので私の標準的な "一時ファイル"です。 '-o qq 'は出力を' qq'ファイルに書き出すことを意味します。私はそれを完全に残して、ただ 'a.out'を得るのはもっと簡単だと思うけど、古い習慣は大変だ。うまくいけば混乱を避けるためにそれをprognameに変更しました。 – paxdiablo

+0

gotcha、ありがとう! –

0

構造定義の最後にセミコロンがありません。メソッドと混合してください。他のポスターが言及している問題に加えて

my_thing thinger = { 123 };

0

thinger.blah = 123;の線に沿ってでなければなりません。コンパイルするようにサンプルを更新してください。

関連する問題