在今天之前,我始终认为在链接阶段将对象和库传递给g ++的顺序并不重要.然后,今天,我尝试从c ++代码链接到c代码.我将所有C头文件包装在一个extern"C"块中,但链接器仍然很难找到我知道在C对象归档中的符号.
困惑,我创建了一个相对简单的例子来隔离链接错误,但令我惊讶的是,更简单的示例链接没有任何问题.
经过一些试验和错误后,我发现通过模拟简单示例中使用的链接模式,我可以得到主要代码链接OK.模式首先是对象代码,对象归档第二,例如:
g++ -o serverCpp serverCpp.o algoC.o libcrypto.a
任何人都可以解释为什么会这样吗?我在链接普通的c ++代码时从未见过这个问题.
我正在学习C++.我正在尝试做一个练习,我用一个函数定义了几个纯虚拟类的实现.我在连接使用这些实现的类时遇到问题.
==> BasicMath.h <==
#ifndef BASIC_MATH_H
#define BASIC_MATH_H
#include<string>
#include<vector>
class BasicMath { };
#endif // BASIC_MATH_H
==> Operation.h <==
#ifndef OPERATION
#define OPERATION
#include<string>
#include<vector>
class Operation {
public:
virtual void perform(std::vector<std::string> vec) = 0;
};
#endif // OPERATION
==> Sum.h <==
#ifndef SUM_H
#define SUM_H
#include "Operation.h"
class Sum: public Operation {
public:
void perform(std::vector<std::string> vec);
};
#endif // SUM_H
==> BasicMath.cpp <==
#ifndef BASIC_MATH_C
#define BASIC_MATH_C
#include <string>
#include <vector>
#include <iostream>
#include "BasicMath.h"
#include "Sum.h"
int …Run Code Online (Sandbox Code Playgroud) 编辑:我已经大量编辑了这篇文章,将项目剥离到其基本要素.我还添加了一个Github存储库,包括本文中未引用的文件.
我有一个使用subdirs模板的Qt Creator项目(qmake,Qt 5.2.0,Creator 3.0.0).有三个子项目:
TEMPLATE = lib和的图书馆CONFIG += staticlib.TEMPLATE = lib和CONFIG += staticlib并使用Field图书馆.我正在Windows 8.1(MSVC2012)和Linux(gcc 4.8.1)上构建此应用程序.它在Windows上没有问题,但Linux构建表现奇怪.
我得到的错误看起来像这样:
undefined reference to 'vtable for Stadium::Engine'
Run Code Online (Sandbox Code Playgroud)
我已经将这个项目重写为一组显示错误的裸文件.你可以在Github上找到它:足球.随意克隆它,并为自己看到所有的错误.该661441c承诺解决问题,并09836f9提交包含错误.
Stadium Engine.h文件是一个抽象类.它看起来像这样:
#ifndef STADIUM_ENGINE_H
#define STADIUM_ENGINE_H
#include <QObject>
namespace Stadium {
class Engine : public QObject
{
Q_OBJECT
public slots:
virtual void executeCommand() = 0;
};
} …Run Code Online (Sandbox Code Playgroud) 我有代码:
#include <iostream>
#include <QThread>
#include <unistd.h>
#include <stdlib.h>
#include <QApplication>
using std::cerr;
using std::endl;
class Thread : public QThread
{
Q_OBJECT
public:
Thread();
~Thread();
void setMessage(const QString &_message);
void stop();
protected:
void run();
private:
QString message;
volatile bool stopped;
};
Thread::Thread()
{
stopped = false;
run();
}
Thread::~Thread()
{
}
void Thread::run()
{
while(!stopped){
cerr << qPrintable(message);
sleep(1);
}
stopped = false;
cerr << endl;
}
void Thread::stop()
{
stopped = true;
}
void Thread::setMessage(const QString &_message)
{
message …Run Code Online (Sandbox Code Playgroud) 我在这里检查了最常见的未定义的vtable问题引用,虽然这让我更好地理解了发生了什么,但我仍然无法收集足够的信息来弄清楚为什么我有这个错误.
我有一个简单的Square类,最初我试图从Polygon类继承.由于我对C++已经相对了解并且还在学习,所以我还没有尝试过多态性.
无论如何,在我试图摆脱基类(Polygon)后,我认为这可能会有所帮助.不幸的是,我仍然遇到同样的错误,我不知道发生了什么.我所知道的是,最初,Polygon该类需要一个至少包含构造函数定义的源文件,我给了它.这摆脱vtable了Polygon班级的错误.
我的主要问题是我仍然在为Square类继承这个,它应该从Polygon类继承.我想知道的是我如何正确实现这一点以避免在vtable获得多态性的同时获得错误?
码
Polygon.h /的.cpp
#ifndef POLYGON_H
#define POLYGON_H
#include "Shape.h"
#include "vector3f.h"
class Polygon
{
public:
Polygon();
virtual void Collide(Shape &s) = 0;
virtual void Collide(Polygon &p) = 0;
virtual bool Intersects(const Shape &s) = 0;
virtual bool Intersects(const Polygon &s) = 0;
protected:
virtual void Draw() const = 0;
};
#endif // POLYGON_H
//------------------
#include "Polygon.h" …Run Code Online (Sandbox Code Playgroud)