C ++链接类奇怪的行为

时间:2017-04-11 07:47:47

标签: c++ class

以下代码代表策略设计模式。

考虑以下程序结构:

// base.hpp

#ifndef BASE_HPP
#define BASE_HPP

class Base {
  public:
    virtual ~Base() {};
    virtual int solve() = 0;
};

#endif

// derived.hpp

#include "base.hpp"

class Derived: public Base {
  public:
    virtual int solve() { return 77; }
};

我有一个client.cpp,它接收Derived的上下文

#include "client.hpp"
#include <iostream>

void Client::operate() {
  std::cout << solver_.solve() << std::endl;

}

这是客户端的头文件:

#include "base.hpp"

class Client {
  public:
    Client(Base& b): solver_(b) {}
    void operate();
  private:
    Base& solver_;
};

我的主要:test.cpp

#include "client.hpp"
#include "derived.hpp"

int main() {
  Derived d;
  Client c(d);
  c.operate() ;
}

我希望它打印77,但该程序根本不打印任何东西。

客户端通过它的构造函数接收Derived的上下文,并将其存储为Base&amp; solver_; 首先,调用Client的操作方法,该方法调用从Base派生的类的适当求解方法。在这种情况下,派生。

是的,那应该输出77,但事实并非如此。该程序编译良好,没有错误,只需清理退出。有任何想法吗 ?

我使用以下命令编译它:

g++ -o program.exe client.cpp test.cpp

我正在使用GCC版本5.3.0

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。问题是某些库没有用g ++链接,即libstdc ++ - 6.dll。

使用-static-libgcc -static-libstdc ++选项可以修复此问题

该定义给出: &#34;当g ++程序用于链接C ++程序时,它通常会自动链接到libstdc ++。如果libstdc ++作为共享库提供,并且未使用-static选项,那么这将链接到libstdc ++的共享版本。这通常很好。但是,冻结程序使用的libstdc ++版本有时很有用,而不会一直到完全静态链接。 -static-libstdc ++选项指示g ++驱动程序静态链接libstdc ++,而不必静态链接其他库。&#34;

请参阅:random sample