0

Genetic Algorithm Library のコードをオンラインで見つけたので、そのコードを動的ライブラリにコンパイルしようとしています。コードをビルドするときにエラーが発生し続けます。

BinaryChromosome.obj : エラー LNK2001: 未解決の外部シンボル "class Common::GaRandomBool * GaGlobalRandomBoolGenerator" (?GaGlobalRandomBoolGenerator@@3PAVGaRandomBool@Common@@A)

コードの一部を次に示します。

ランダム.h:

#include "stdafx.h"


#ifndef __GA_RANDOM_H__
#define __GA_RANDOM_H__

#include <time.h>

#include "Platform.h"
#include "Threading.h"

namespace Common
{
/// <summary>This union is used for conversation from 32-bits long integer random number
/// to single precision floating point number in interval (0, 1).</summary>
union GaUnsignedIntToFloat
{

    /// <summary>This field is used to store 32-bit long integer number.</summary>
    unsigned int bits;

    /// <summary>field is used to read 32-bit long integer number as mantissa of single precision floating point number.</summary>
    float number;

};

/// <summary>This union is used for conversation from 64-bits long integer random number
/// to double precision floating point number in interval (0, 1).</summary>
union GaUnsignedIntToDouble
{

    /// <summary>This field is used to store 64-bit long integer number.</summary>
    unsigned int bits[ 2 ];

    /// <summary>This field is used to read 64-bit long integer number as mantissa of single precision floating point number.</summary>
    double number;

};

/// <summary><c>GaRandomGenerator</c> class implements algorithm for generating 64-bits wide random unsigned integers and floating-point numbers.
/// It takes care of architecture's endianness, but underlying CPU architecture must support floating-point by IEEE 754 standard.
/// <c>GaRandomGenerator</c> class does not implement <see cref="GaRandom" /> interface. Primary purpose of this class is to provide service
/// for generating random numbers for classes which implement <see cref="GaRandom" /> interface.
///
/// This class has built-in synchronizator so it is allowed to use <c>LOCK_OBJECT</c> and <c>LOCK_THIS_OBJECT</c> macros with instances of this class.
/// All public methods are thread-safe.</summary>
class GaRandomGenerator
{

    DEFINE_SYNC_CLASS

private:

    /// <summary>Defines representations of random generator's state.</summary>
    struct GaState
    {

        /// <summary>The first part of random generator state.</summary>
        unsigned int _w;

        /// <summary>The second part of random generator state.</summary>
        unsigned int _z;

    };

    /// <summary>Current state of random generator.</summary>
    GaState _currentState;

    /// <summary>This attribute indicates endianness of architecture. If it is set to <c>true</c>, the architecture is little-endian,
    /// if the architecture is big-endian this attribute is set to <c>false</c>.</summary>
    bool _littleEndian;

public:

    /// <summary>This constructor initialize random generator with current time as seed.</summary>
    GaRandomGenerator()
    {
        unsigned long long x = (unsigned long long)time( NULL );
        Initalization( (unsigned int)( x >> 16 ), (unsigned int)x );
    }

    /// <summary>This constructor initialize random generator with user-defined seed.</summary>
    /// <param name="seed">user-defined seed.</param>
    GaRandomGenerator(unsigned int seed) { Initalization( seed, 0 ); }

    /// <summary><c>Generate</c> method generates and returns 32-bit wide unsigned integer.
    ///
    /// This method is thread-safe.</summary>
    /// <returns>Method returns generated number.</returns>
    GAL_API
    unsigned int GACALL Generate();

    /// <summary><c>GeneratrFloat</c> method generates single precision floating point number i interval (0, 1).
    ///
    /// This method is thread-safe.</summary>
    /// <returns>Method returns generated number.</returns>
    GAL_API
    float GACALL GenerateFloat();

    /// <summary><c>GeneratrFloat</c> method generates double precision floating point number i interval (0, 1).
    ///
    /// This method is thread-safe.</summary>
    /// <returns>Method returns generated number.</returns>
    GAL_API
    double GACALL GenerateDouble();

    /// <summary>Initializes random generator with specified seed. <c>Initialization</c> method is called by constructor.</summary>
    /// <param name="seed1">seed used to initialize the first part of generator's state.</param>
    /// <param name="seed2">seed used to initialize the second part of generator's state.</param>
    GAL_API
        void GACALL Initalization(unsigned int seed1,
        unsigned int seed2);

};// END CLASS DEFINITION GaRandomGenerator

/// <summary>Interface for random value generators.</summary>
/// <param name="TYPE">type of generated values.</param>
template <typename TYPE>
class GaRandom
{

public:

    /// <summary>This method generates random values of <c>TYPE</c> with no specific range.</summary>
    /// <returns>Returns generate random value.</returns>
    virtual TYPE GACALL Generate()=0;

    /// <summary>This method generates random value of <c>TYPE</c> with specified maximum.</summary>
    /// <param name="max">maximal value which can be generated.</param>
    /// <returns>Returns generate random value.</returns>
    virtual TYPE GACALL Generate(const TYPE& max)=0;

    /// <summary>This method generates random value of <c>TYPE</c> within specified range of values.</summary>
    /// <param name="min">minimal value which can be generated.</param>
    /// <param name="max">maximal value which can be generated.</param>
    /// <returns>Returns generate random value.</returns>
    virtual TYPE GACALL Generate(const TYPE& min,
        const TYPE& max)=0;

};// END CLASS DEFINITION GaRandom

/// <summary><c>GaRandomInteger</c> class generates random 32-bits wide integer numbers. The class implements <see cref="GaRandom" /> interface.
/// This class has no built-in synchronizator, so <c>LOCK_OBJECT</c> and <c>LOCK_THIS_OBJECT</c> macros cannot be used with instances of this class,
/// but all public methods are thread-safe.</summary>
class GaRandomInteger : public GaRandom<int>
{

private:

    /// <summary>Instance of algorithm for generating random numbers.</summary>
    GaRandomGenerator _generator;

public:

    /// <summary>This constructor initializes random generator with current time as seed.</summary>
    GaRandomInteger() { }

    /// <summary>This constructor initialize random generator with user-defined seed.</summary>
    /// <param name="seed">user-defined seed.</param>
    GaRandomInteger(unsigned long seed) : _generator(seed) { }

    /// <summary>This method generates random values in interval(0, 2147483647).
    ///
    /// This method is thread-safe.</summary>
    /// <returns>Returns generate random value.</returns>
    virtual int GACALL Generate()
    {
        unsigned int w1 = _generator.Generate();
        return (int)w1 < 0 ? -(int)w1 : (int)w1;
    }

    /// <summary>This method generates random values in interval(0, <c>max</c>).
    ///
    /// This method is thread-safe.</summary>
    /// <param name="max">maximal value which can be generated.</param>
    /// <returns>Returns generate random value.</returns>
    virtual int GACALL Generate(const int& max) { return (int)( _generator.GenerateDouble() * ( max + 1 ) ) % ( max + 1 ); }

    /// <summary>This method generates random values in interval(<c>min</c>, <c>max</c>).
    ///
    /// This method is thread-safe.</summary>
    /// <param name="min">minimal value which can be generated.</param>
    /// <param name="max">maximal value which can be generated.</param>
    /// <returns>Returns generate random value.</returns>
    virtual int GACALL Generate(const int& min,
        const int& max) { return min + Generate( max - min ); }

};// END CLASS DEFINITION GaRandomInteger

/// <summary><c>GaRandomFloat</c> class generates random single  precision floating-point numbers. Targeted architecture must support IEEE 754 standard.
/// The class implements <see cref="GaRandom" /> interface. This class has no built-in synchronizator, so <c>LOCK_OBJECT</c> and <c>LOCK_THIS_OBJECT</c>
/// macros cannot be used with instances of this class, but all public methods are thread-safe.</summary>
class GaRandomFloat : public GaRandom<float>
{

private:

    /// <summary>Instance of algorithm for generating random numbers.</summary>
    GaRandomGenerator _generator;

public:

    /// <summary>This constructor initializes random generator with current time as seed.</summary>
    GaRandomFloat() { }

    /// <summary>This constructor initialize random generator with user-defined seed.</summary>
    /// <param name="seed">user-defined seed.</param>
    GaRandomFloat(unsigned long seed) : _generator(seed) { }

    /// <summary>This method generates random values in interval(0, 1).
    ///
    /// This method is thread-safe.</summary>
    /// <returns>Returns generate random value.</returns>
    virtual float GACALL Generate() { return _generator.GenerateFloat(); }

    /// <summary>This method generates random values in interval(0, <c>max</c>).
    ///
    /// This method is thread-safe.</summary>
    /// <param name="max">maximal value which can be generated.</param>
    /// <returns>Returns generate random value.</returns>
    virtual float GACALL Generate(const float& max) { return max * _generator.GenerateFloat(); }

    /// <summary>This method generates random values in interval(<c>min</c>, <c>max</c>).
    ///
    /// This method is thread-safe.</summary>
    /// <param name="min">minimal value which can be generated.</param>
    /// <param name="max">maximal value which can be generated.</param>
    /// <returns>Returns generate random value.</returns>
    virtual float GACALL Generate(const float& min,
                     const float& max) { return min + Generate( max - min ); }

};// END CLASS DEFINITION GaRandomFloat

/// <summary><c>GaRandomDouble</c> class generates random double precision floating-point numbers. Class takes care about endianness of the architecture.
/// Targeted architecture must support IEEE 754 standard. The class implements <see cref="GaRandom" /> interface. This class has no built-in synchronizator,
/// so <c>LOCK_OBJECT</c> and <c>LOCK_THIS_OBJECT</c> macros cannot be used with instances of this class, but all public methods are thread-safe.</summary>
class GaRandomDouble : public GaRandom<double>
{

private:

    /// <summary>Instance of algorithm for generating random numbers.</summary>
    GaRandomGenerator _generator;

public:

    /// <summary>This constructor initializes random generator with current time as seed.</summary>
    GaRandomDouble() { }

    /// <summary>This constructor initialize random generator with user-defined seed.</summary>
    /// <param name="seed">user-defined seed.</param>
    GaRandomDouble(unsigned long seed) : _generator(seed) { }

    /// <summary>This method generates random values in interval(0, 1).
    ///
    /// This method is thread-safe.</summary>
    /// <returns>Returns generate random value.</returns>
    virtual double GACALL Generate() { return _generator.GenerateDouble(); }

    /// <summary>This method generates random values in interval(0, <c>max</c>).
    ///
    /// This method is thread-safe.</summary>
    /// <param name="max">maximal value which can be generated.</param>
    /// <returns>Returns generate random value.</returns>
    virtual double GACALL Generate(const double& max) { return max * _generator.GenerateDouble(); }

    /// <summary>This method generates random values in interval(<c>min</c>, <c>max</c>).
    ///
    /// This method is thread-safe.</summary>
    /// <param name="min">minimal value which can be generated.</param>
    /// <param name="max">maximal value which can be generated.</param>
    /// <returns>Returns generate random value.</returns>
    virtual double GACALL Generate(const double& min,
        const double& max) { return min + Generate( max - min ); }

};// END CLASS DEFINITION GaRandomDouble

/// <summary><c>GaRandomBool</c> class generates random boolean values. It supports generating boolean with defined probabilities of 
/// <c>true</c> and <c>false</c> states. The class implements <see cref="GaRandom" /> interface. This class has no built-in synchronizator,
/// so <c>LOCK_OBJECT</c> and <c>LOCK_THIS_OBJECT</c> macros cannot be used with instances of this class, but all public methods are thread-safe.</summary>
class GaRandomBool : public GaRandom<bool>
{

private:

    /// <summary>Instance of algorithm for generating random numbers.</summary>
    GaRandomGenerator _generator;

public:

    /// <summary>This constructor initializes random generator with current time as seed.</summary>
    GaRandomBool() { }

    /// <summary>This constructor initialize random generator with user-defined seed.</summary>
    /// <param name="seed">user-defined seed.</param>
    GaRandomBool(unsigned long seed) : _generator(seed) { }

    /// <summary>This method generates random Boolean values.
    ///
    /// This method is thread-safe.</summary>
    /// <returns>Returns generate random value.</returns>
    virtual bool GACALL Generate() { return ( _generator.Generate() & 1 ) == 1; }

    /// <summary>This method generates random Boolean values.
    ///
    /// This method is thread-safe.</summary>
    /// <param name="max">this parameter is ignored.</param>
    /// <returns>Returns generate random value.</returns>
    virtual bool GACALL Generate(const bool& max) { return Generate(); }

    /// <summary>This method generates random Boolean values.
    ///
    /// This method is thread-safe.</summary>
    /// <param name="min">this parameter is ignored.</param>
    /// <param name="max">this parameter is ignored.</param>
    /// <returns>Returns generate random value.</returns>
    virtual bool GACALL Generate(const bool& min,
        const bool& max) { return Generate(); }

    // Generates boolean with p probability of TRUE and 1-p probability of FALSE
    /// <summary>This method generates Boolean value with <c>p</c> probability of <c>true</c> value.
    ///
    /// This method is thread safe.</summary>
    /// <param name="p">probability of <c>true</c> value (0, 1).</param>
    /// <returns>Returns generate random value.</returns>
    inline bool GACALL Generate(double p) { return _generator.GenerateFloat() < p; }

    // Generates boolean with p probability of TRUE and 100-p probability of FALSE. p is expressed in 
    /// <summary>This method generates Boolean value with <c>p</c> probability of <c>true</c> and <c>100-p</c> of <c>false</c> value.
    ///
    /// This method is thread safe.</summary>
    /// <param name="p">probability in percents of <c>true</c> value (0 - 100).</param>
    /// <returns>Returns generate random value.</returns>
    inline bool GACALL Generate(int p) { return (int)( _generator.GenerateDouble() * 100 ) < p; }

};// END CLASS DEFINITION GaRandomBool

} // Common

#endif // __GA_RANDOM_H__

GlobalRandomGenerator.h:

#include "stdafx.h"


#include "Platform.h"
#include "Random.h"

#if defined(GAL_API_EXPORTING)

/// <summary>Global object used by GAL to generate random integer numbers. It cannot be used prior calling <see cref="GaInitialize" />
/// and after calling <see cref="GaFinalize" />. For more details see <see cref="GaRandomInteger" /> class.</summary>
extern Common::GaRandomInteger * GaGlobalRandomIntegerGenerator;

/// <summary>Global object used by GAL to generate random single precision floating point numbers. It cannot be used prior calling <see cref="GaInitialize" />
/// and after calling <see cref="GaFinalize" />. For more details see <see cref="GaRandomInteger" /> class.</summary>
extern Common::GaRandomFloat * GaGlobalRandomFloatGenerator;

/// <summary>Global object used by GAL to generate random double precision floating point numbers. It cannot be used prior calling <see cref="GaInitialize" />
/// and after calling <see cref="GaFinalize" />. For more details see <see cref="GaRandomInteger" /> class.</summary>
extern Common::GaRandomDouble * GaGlobalRandomDoubleGenerator;

/// <summary>Global object used by GAL to generate random Boolean values. It cannot be used prior calling <see cref="GaInitialize" />
/// and after calling <see cref="GaFinalize" />. For more details see <see cref="GaRandomInteger" /> class.</summary>
extern Common::GaRandomBool * GaGlobalRandomBoolGenerator;

#else

#if defined(GAL_PLATFORM_WIN)

GAL_API Common::GaRandomInteger* GaGlobalRandomIntegerGenerator;
GAL_API Common::GaRandomFloat* GaGlobalRandomFloatGenerator;
GAL_API Common::GaRandomDouble* GaGlobalRandomDoubleGenerator;
GAL_API Common::GaRandomBool* GaGlobalRandomBoolGenerator;

#elif defined(GAL_PLATFORM_NIX)

extern Common::GaRandomInteger* GaGlobalRandomIntegerGenerator;
extern Common::GaRandomFloat* GaGlobalRandomFloatGenerator;
extern Common::GaRandomDouble* GaGlobalRandomDoubleGenerator;
extern Common::GaRandomBool* GaGlobalRandomBoolGenerator;

#endif

#endif
4

1 に答える 1

1

問題はこれにあります

#if defined(GAL_PLATFORM_WIN)

GAL_API Common::GaRandomInteger* GaGlobalRandomIntegerGenerator;
GAL_API Common::GaRandomFloat* GaGlobalRandomFloatGenerator;
GAL_API Common::GaRandomDouble* GaGlobalRandomDoubleGenerator;
GAL_API Common::GaRandomBool* GaGlobalRandomBoolGenerator;

#elif defined(GAL_PLATFORM_NIX)

extern Common::GaRandomInteger* GaGlobalRandomIntegerGenerator;
extern Common::GaRandomFloat* GaGlobalRandomFloatGenerator;
extern Common::GaRandomDouble* GaGlobalRandomDoubleGenerator;
extern Common::GaRandomBool* GaGlobalRandomBoolGenerator;

#endif

GAL_PLATFORM_WIN がプロジェクトで定義されており、このライブラリを使用する他のプロジェクトでは定義されていないことを確認してください

于 2013-06-27T14:52:07.843 に答える