使用静态库时未定义的函数引用

时间:2012-06-29 18:27:32

标签: c++ netbeans undefined static-linking

我正在尝试使用遗传算法编写程序,遗传算法是一种特殊类型的优化算法。我找到了一个名为“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(pop)问题。但是,我现在在我正在使用的一个静态库的头文件中看到类似的错误以及与一个基本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&)'

2 个答案:

答案 0 :(得分: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,您可以执行以下操作:

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

答案 1 :(得分:1)

许多人在第一次尝试使用EO C ++ lib时遇到了这个问题。我也遇到了这个问题,并且能够找到解决方案。问题是链接器在构建EO程序时找不到必须链接的静态库。我现在能够成功编译并使用第一个教程,即 FirstBitGA.cpp &amp; Ubunut 10.04(LTS)上的 FirstRealGA.cpp EO-1.3.1

注意:我正在编写从安装开始的完整步骤,请耐心等待。同时将“用户名”替换为您的用户帐户。

<强>&LT;&LT;解决方案&gt;&gt;

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

    6.1。将文件包含为g ++的命令行参数的路径,即-I / home / username / EO / eo / src &lt;或&gt; 如果您使用的是Qt creator IDE,请在probject的.pro文件中输入“INCLUDEPATH + = / home / username / EO / eo / src”行。

    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 Creator用户,请在.pro文件中输入以下行,

    LIBS + = -L / home / username / 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

  9. <强>享受