对 vtable SFML Android 的未定义引用

Undefined reference to vtable SFML Android

本文关键字:未定义 引用 Android vtable SFML      更新时间:2023-10-16

我正在编译一个在安卓上使用SFML的程序。当我使用 g++ 编译它时,它可以正常编译。当我在安卓项目目录中运行ndk-build时,出现以下错误:

/home/engineer/Desktop/android_ndk/android-ndk-r11c/toolchains/arm-    linux-androideabi-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9/../../../../arm-linux-androideabi/bin/ld: the vtable symbol may be undefined because the class is missing its key function (see go/missingkeymethod)
/home/engineer/Desktop/android/jni/SandJar.hpp:16: error: undefined reference to 'vtable for SandJar'

我有一个抽象的类jar和2个类sandyJar和sandjar,它们都继承了它。但是,我不明白为什么它为 g++ 编译但不为 ndk-build 命令编译。以下是一些剥离的源文件(它从main编译):

主.cpp:

int main(int argc, char *argv[])
{
    sf::RenderWindow window(sf::VideoMode::getDesktopMode(), "");
    int WIDTH = window.getSize().x;
    int HEIGHT = window.getSize().y;
    vector<Jar*> jars;
    SandJar SJAR(5,5,5,WIDTH, HEIGHT);
    CandyJar CJAR(5,5,5,WIDTH, HEIGHT);
    CJAR.add();
    CJAR.move(120, 0);
    jars.push_back(&CJAR);
    jars.push_back(&SJAR);
    etc.
}

Jar.hpp

class Jar 
{
    public:
        virtual void add() = 0;
        virtual void draw(sf::RenderWindow&) = 0;
        virtual void update() = 0;
        virtual void move(int,int) = 0;
        virtual void setScale(float) = 0;
        virtual void incAnim() = 0;
        virtual void decAnim() = 0;
};

沙罐

class SandJar : public Jar
{
public:
  //initializer
  SandJar(const int, const int, const int, const int, const int);
  SandJar(const int);
  //function for adding candy
  void add();
  void update();
  void draw(sf::RenderWindow&);
  void incAnim();
  void decAnim();
  void move(int, int);
  void setScale(float);
private:
 //vars
};

沙罐.cpp

SandJar::SandJar(int Capacity){
}
SandJar::SandJar(int Width, int Height, int Capacity, int WindowW, int WindowH){
}
void SandJar::init() {
}
void SandJar::incAnim() {
}
void SandJar::decAnim() {
}
void SandJar::move(int x, int y)
{
}
void SandJar::setScale(float scl)
{
}
void SandJar::update() {
}
void SandJar::add() {
}
void SandJar::draw(sf::RenderWindow& window) {
}

事实证明,任何代码都没有问题。问题是用于该项目的 Android.mk 文件。我将 hpp 和 cpp 文件附加到LOCAL_SRC_FILES并且它构建正确。它说不要在LOCAL_SRC_FILES中包含"包含",但一旦添加,它就会正确编译。可能有更好的解决方法。