1

リンク時に奇妙なエラーが発生します。

ヘッダー:

グローバル.h

#include <cmath>
#include <iostream>
#include <vector>

#include <blitz/tinyvec2.h>
typedef blitz::TinyVector<double,3> vettore;

#include "animal.h"

animal.h

#ifndef __ANIMAL_H
#define __ANIMAL_H


//! basic data structure for an animal -------------------------
struct Animal
{
   int age;
public:
   Animal(int _age) : age(_age) {}
};


//! contains info about a pair of animals ----------------------
struct AnimalPairs
{
  vettore distance;

  AnimalPairs( const vettore& _distance ) : distance(_distance) {}
};
typedef std::vector<AnimalPairs> pair_list;


//! data structure for a group of animals ----------------------
class AnimalVector
{
private:
  std::vector<Animal> animals;
  pair_list pairs;

public:
  AnimalVector( const  AnimalVector &other );

};

#endif

そして、ここに*cppファイルがあります

main.cpp

#include "global.h"
int main ()
{
   std::cout<< "Hello" << std::endl;
}

動物.cpp

#include "global.h"

AnimalVector::AnimalVector( const AnimalVector &other )
{
  pairs = other.pairs;
}

コンパイルするには、私が使用します g++ main.cpp animal.cpp -I/usr/include/boost -I/fs01/ma01/homes/matc/local/blitz/include

ここに私が得るエラーがあります:

/tmp/ccGKHwoj.o: In function `AnimalPairs::AnimalPairs(AnimalPairs const&)':
animal.cpp:(.text._ZN11AnimalPairsC2ERKS_[_ZN11AnimalPairsC5ERKS_]+0x1f):
undefined reference to \`blitz::TinyVector<double,
3>::TinyVector(blitz::TinyVector<double, 3> const&)'
collect2: error: ld returned 1 exit status

何らかの理由で、AnimalVectorコンストラクターを に設定するとinline、コードが機能します。誰かが私に理由を説明できますか?

編集: https://github.com/syntheticpp/blitz/blob/master/blitz/tinyvec2.hへのリンクは次のとおりです。blitz/tinyvec2.h

4

1 に答える 1

1

tinyvec2.ccで宣言されたメソッドを使用するときに含める必要があるファイルです。tinyvec2.h

私はその命名( という名前のインクルードファイル.cc)が嫌いで、エラーが発生する前に自分で見落としていたでしょう。

しかし、その .cc ファイルの内容を見ると、使用目的は明らかです。

同様の状況 (ファイルのペアの命名規則が大きく異なる) では、次のコーディング イディオムを使用します。

最初のインクルード ファイル (.h) は、これを必要とする他の .h ファイルによってインクルードされます。2 番目のインクルード ファイルは、他の .h ファイルによってインクルードされることはありません。

一部が欠落していることを示すビルド エラーが発生した場合は、2 番目のインクルード ファイルのインクルードを、ビルド エラーが発生した任意の .cpp ファイルに追加します。

この計画は、大規模なプロジェクトでビルド速度を高速に保ち、複雑に相互作用するテンプレート クラス間の循環依存を最小限に抑えるのに非常に効果的です。しかし、tinyvec2 を 2 つのインクルード ファイルに分割した人が考えていたこととは正確には一致しない可能性があります。

結論: リンク エラーが発生したモジュールは、コンパイル時に .cc ファイルが含まれている必要がありますが、直接的か間接的かはあなた次第です。global.h に .cc を含める方が簡単ですが、最悪の場合、ビルド速度が遅くなります (この .cc は独自の .h ファイルと循環関係を持たないため)。

于 2015-10-27T15:16:30.563 に答える