2012-06-29 76 views
1

我正在尝试使用遗传算法编写程序,这是一种特殊类型的优化算法。我找到了一个名为“Evolutionary Objects”这个任务的免费库,并实现了一个非常简单的遗传算法实例。程序代码,netbeans实现的构建命令,以及我收到的错误消息将在以下单独的块中发布。如果您允许我提供帮助,您会发现cout功能出现问题。当我在网上搜索类似的困难时,我发现人们通过简单地使用g ++而不是gcc纠正了这个问题,但是我已经在使用g ++了,正如你所看到的。任何帮助,将不胜感激....使用静态库时未定义的函数引用

程序代码立即低于:

#include <stdexcept> 
#include <iostream> 
#include <eo> 
#include <ga.h> 

typedef eoBit<double> Indi; 

double binary_value(const Indi & _indi) 
{ 
    double sum = 0; 
    for (unsigned i = 0; i < _indi.size(); i++) 
    sum += _indi[i]; 
    return sum; 
} 

void main_function(int argc, char **argv) 
{ 

    const unsigned int SEED = 42;  // seed for random number generator 
    const unsigned int T_SIZE = 3;  // size for tournament selection 
    const unsigned int VEC_SIZE = 16; // Number of bits in genotypes 
    const unsigned int POP_SIZE = 100; // Size of population 
    const unsigned int MAX_GEN = 400; // Maximum number of generation before STOP 
    const float CROSS_RATE = 0.8;  // Crossover rate 
    const double P_MUT_PER_BIT = 0.01; // probability of bit-flip mutation 
    const float MUT_RATE = 1.0;  // mutation rate 

    rng.reseed(SEED); 

    eoEvalFuncPtr<Indi> eval( binary_value); 

    eoPop<Indi> pop; 

    for (unsigned int igeno=0; igeno<POP_SIZE; igeno++) 
    { 
     Indi v;   // void individual, to be filled 
     for (unsigned ivar=0; ivar<VEC_SIZE; ivar++) 
    { 
     bool r = rng.flip(); // new value, random in {0,1} 
     v.push_back(r);  // append that random value to v 
    } 
     eval(v);     // evaluate it 
     pop.push_back(v);  // and put it in the population 
    } 

    pop.sort(); 

    cout << "Initial Population" << endl; 
    cout << pop; 

    eoDetTournamentSelect<Indi> select(T_SIZE); // T_SIZE in [2,POP_SIZE] 
    eo1PtBitXover<Indi> xover; 
    eoBitMutation<Indi> mutation(P_MUT_PER_BIT); 

    eoGenContinue<Indi> continuator(MAX_GEN); 

    eoSGA<Indi> gga(select, xover, CROSS_RATE, mutation, MUT_RATE, eval, continuator); 

    gga(pop); 

    pop.sort(); 
    cout << "FINAL Population\n" << pop << endl; 
} 

int main(int argc, char **argv) 
{ 
main_function(argc, argv); 
    return 1; 
} 
} 

Netbeans的我表明它正试图构建的时候这样做:

make[1]: Entering directory `/home/gregemerson/EO_GA/EO_GA' 
rm -f -r build/Debug 
rm -f dist/Debug/GNU-Linux-x86/eo_ga 
make[1]: Leaving directory `/home/gregemerson/EO_GA/EO_GA' 


CLEAN SUCCESSFUL (total time: 94ms) 

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf 
make[1]: Entering directory `/home/gregemerson/EO_GA/EO_GA' 
"/usr/bin/make" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/eo_ga 
make[2]: Entering directory `/home/gregemerson/EO_GA/EO_GA' 
mkdir -p build/Debug/GNU-Linux-x86 
rm -f build/Debug/GNU-Linux-x86/main.o.d 
g++ -c -g -I../../EO/EO/eo/src -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.cpp 
mkdir -p dist/Debug/GNU-Linux-x86 
g++  -o dist/Debug/GNU-Linux-x86/eo_ga build/Debug/GNU-Linux-x86/main.o -L../../EO/EO/eo/build/lib /home/gregemerson/EO/EO/eo/build/lib/libcma.a /home/gregemerson/EO/EO/eo/build/lib/libeoutils.a /home/gregemerson/EO/EO/eo/build/lib/libes.a /home/gregemerson/EO/EO/eo/build/lib/libga.a 

错误消息立即如下:

/home/gregemerson/EO_GA/EO_GA/main.cpp:94: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, eoPrintable const&)' 
/home/gregemerson/EO_GA/EO_GA/main.cpp:99: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, eoPrintable const&)' 
/home/gregemerson/EO_GA/EO_GA/main.cpp:149: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, eoPrintable const&)' 
build/Debug/GNU-Linux-x86/main.o: In function `eoPop<eoBit<double> >::sortedPrintOn(std::basic_ostream<char, std::char_traits<char> >&) const': 
/home/gregemerson/EO_GA/EO_GA/../../EO/EO/eo/src/eoPop.h:294: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, eoPrintable const&)' 
build/Debug/GNU-Linux-x86/main.o: In function `std::ostream_iterator<eoBit<double>, char, std::char_traits<char> >::operator=(eoBit<double> const&)': 
/usr/include/c++/4.6/bits/stream_iterator.h:198: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, eoPrintable const&)' 
collect2: ld returned 1 exit status 
make[2]: *** [dist/Debug/GNU-Linux-x86/eo_ga] Error 1 
make[2]: Leaving directory `/home/gregemerson/EO_GA/EO_GA' 
make[1]: *** [.build-conf] Error 2 
make[1]: Leaving directory `/home/gregemerson/EO_GA/EO_GA' 
make: *** [.build-impl] Error 2 

您的回答确实对我的cout(流行)问题是正确的。然而,我现在正在使用一个静态库的头文件中看到类似的错误,以及看起来与某个基本C++库相关的错误。我得到以下。你能理解这个吗?

build/Debug/GNU-Linux-x86/main.o: In function `std::ostream_iterator<eoBit<double>, char, std::char_traits<char> >::operator=(eoBit<double> const&)': 
/usr/include/c++/4.6/bits/stream_iterator.h:198: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, eoPrintable const&)' 
build/Debug/GNU-Linux-x86/main.o: In function `eoPop<eoBit<double> >::sortedPrintOn(std::basic_ostream<char, std::char_traits<char> >&) const': 
/home/gregemerson/EO_GA/EO_GA/../../EO/EO/eo/src/eoPop.h:294: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, eoPrintable const&)' 
+0

它看起来没有像'cout'的任何错误 - 但严重的是,在标题中删除了'using namespace std;'。如果你需要*它,把它放在源文件中,但[*从不*在头部](http://stackoverflow.com/questions/6077566/using-namespace-std)。它看起来像'cout << pop;'是你的问题。什么是'eoPop'? –

+0

@Sam:[eoPop < EOT > Class Template Reference](http://eodev.sourceforge.net/eo/doc/html/classeo_pop.html) – ildjarn

回答

3

的问题是,(例如)在这里:

cout << pop; 

错误,

/home/gregemerson/EO_GA/EO_GA/main.cpp:94: undefined reference to 
`operator<<(std::basic_ostream<char, std::char_traits<char> >&, eoPrintable const&)' 

意味着有一个知道如何把一个eoPrintable对象为没有基本功能ostream

根据评论中提供的link,该eoPop类定义了几种打印方法:sortedPrintOnprintOn

为了使用其中一个打印到cout,你会做以下几点:当他们尝试使用EO C++的lib首次

pop.printOn(cout); //or pop.printOn(std::cout) if you remove using namespace std; 
pop.printSortedOn(cout); 
+0

Hello Sam。我的建议奏效了。谢谢!但是,我发现了另外两个类似的外观错误,这些错误并未由您的修复程序解决,并相应地编辑了我原来的帖子你能帮助解决新问题吗?谢谢! – gcolumbus

+0

@gcolumbus它看起来像是同一个问题,'ostream << eoPop'没有定义,所以当库的函数在内部试图调用它们时,你会看到错误。你肯定你已经把所有的头文件放在正确的位置,并且'#inc''d? –

+0

@SamDeHann我相信一切都是正确的顺序。我三重检查,但也许我需要离开它一段时间。但是,我不明白为什么我在“流迭代器”头中看到错误。这是gnu C++库的一部分,不是吗?你能帮我理解为什么会这样吗?也许我错误地指责了那个标题?谢谢! – gcolumbus

1

许多国家的人民遇到此问题。我也遇到了这个问题,并能够找到解决方案。问题在于链接器在构建EO程序时没有找到必须链接的静态库。我现在能够与EO-1.3.1上Ubunut 10.04(LTS)成功编译和使用教程的第一篇即FirstBitGA.cpp & FirstRealGA.cpp

注:我正在写从安装开始的完整步骤,因此请耐心等待。用您的用户帐户替换“用户名”一词。

< <解决方案>>

  1. 下载EO库从http://sourceforge.net/projects/eodev/files/latest/download?source=files
  2. 创建一个名为EO;我在/ home/username /中创建它。
  3. 将EO Zip文件复制到/ home/username/EO并解压缩。这将在/ home/username/EO下创建另一个名为'eo'的目录。
  4. 现在通过在终端中运行/ home/username/EO/eo/build_gcc_linux_release中的构建脚本来构建安装文件。
  5. 步骤4中的构建脚本将在/ home/username/EO/eo下创建一个名为'版本'的目录。在版本目录中,'lib'文件夹包含编译任何EO程序时必须链接的库。
  6. 现在必须向编译器提供两条路径才能成功编译:

    6.1。如果你使用的是Qt creator IDE,那么输入'INCLUDEPATH + =/home/username/EO/eo/src'在probpro的.pro文件中。

    6.2。与-L参数所有链接库的路径至g ++即

    -L/home/username/EO/eo/release/lib/libcma.a /home/username/EO/eo/release/lib/libeo.a /home/username/EO/eo/release/lib/libeoserial/home/username/EO/eo/release/lib/libeoutils.a /home/username/EO/eo/release/lib/libes.a /home/username/EO/eo/release/lib/libga.a 
    

    对于Qt创建者的用户,进入下面的行进pro文件,

    LIBS + = -L /家/用户名/ EO/eo/release/lib/libcma.a /home/username/EO/eo/release/lib/libeo.a /home/username/EO/eo/release/lib/libeoserial.a/home/username/EO/EO/release/lib目录/ libeoutils.a /home/username/EO/eo/release/lib/libes.a /home/username/EO/eo/release/lib/libga.a

  7. 享受

相关问题