-1

main()を含む1つのcppファイルがあります。別の構造体と関数(たとえば、header.hpp)に依存しています。構造体は、関数プロトタイプとともにheader.hppで定義されています。関数はheader.cppに実装されています。

コンパイルしようとすると、次のようなエラーメッセージが表示されます。

undefined reference to `see_blah(my_thing *)`

したがって、概要を説明します。

header.hpp:

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

header.cpp:

#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;
}

何が間違っているのかわからず、答えも見つかりません。回答ありがとうございます、彼らは非常に感謝しています!

4

6 に答える 6

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あなたが投稿したそのコードで実際にエラーが発生したので、コンパイラがエラーを起こさなかった理由はわかりません。上記のコマンドラインも重要です。1つのステップでコンパイルとリンクを行う場合は、必要なすべてのC ++ソースファイルを提供する必要があります(そうしないと、リンカーがすべてにアクセスできなくなります)。

于 2011-02-07T07:59:34.320 に答える
2

必要がある:

#include "header.hpp"

* main.cppファイル内。

于 2011-02-07T07:49:39.613 に答える
2

あなたのコードは大丈夫です。あなたはそれを間違ってコンパイルしているだけです。試す:

g++ main.cpp header.cpp
于 2011-02-07T07:59:31.220 に答える
1

header.hppをインクルードしている場合は、おそらくit(header.cpp)をmain.cppにリンクしていません。どの環境を使用していますか(g++またはVC++)?

編集:g ++でリンクするには、次のように記述する必要があります。

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

また、構造体の最後にセミコロンがありません。

于 2011-02-07T07:55:09.377 に答える
0

構造体定義の最後にセミコロンがなく、メソッドと混合しています。

于 2011-02-07T08:00:37.287 に答える
0

thinger.blah = 123;次の線に沿っている必要があります:

my_thing thinger = { 123 };

問題に加えて、他のポスターが言及しています。コンパイルするように例を更新してください。

于 2011-02-07T08:00:57.560 に答える